@alikhalilll/a-skeleton 1.1.0 → 1.2.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.
Files changed (53) hide show
  1. package/.media/hero.png +0 -0
  2. package/.media/hero.svg +232 -0
  3. package/README.md +458 -172
  4. package/dist/index.cjs +3685 -840
  5. package/dist/index.cjs.map +1 -1
  6. package/dist/index.d.cts +527 -40
  7. package/dist/index.d.ts +527 -40
  8. package/dist/index.js +3666 -842
  9. package/dist/index.js.map +1 -1
  10. package/dist/nuxt/index.cjs +16 -1
  11. package/dist/nuxt/index.cjs.map +1 -1
  12. package/dist/nuxt/index.js +16 -1
  13. package/dist/nuxt/index.js.map +1 -1
  14. package/dist/resolver/index.cjs +16 -1
  15. package/dist/resolver/index.cjs.map +1 -1
  16. package/dist/resolver/index.js +16 -1
  17. package/dist/resolver/index.js.map +1 -1
  18. package/dist/styles.css +56 -11
  19. package/package.json +8 -2
  20. package/src/components/ASkeleton.vue +212 -113
  21. package/src/components/ASkeletonClone.vue +106 -0
  22. package/src/components/ASkeletonLayer.vue +20 -32
  23. package/src/components/CloneNode.ts +161 -0
  24. package/src/components/StructuralLayerNode.ts +157 -0
  25. package/src/components/icons.ts +45 -0
  26. package/src/components/variants/ASkeletonArticle.vue +33 -0
  27. package/src/components/variants/ASkeletonAvatar.vue +42 -0
  28. package/src/components/variants/ASkeletonButton.vue +37 -0
  29. package/src/components/variants/ASkeletonCard.vue +47 -0
  30. package/src/components/variants/ASkeletonChart.vue +56 -0
  31. package/src/components/variants/ASkeletonChip.vue +32 -0
  32. package/src/components/variants/ASkeletonDivider.vue +26 -0
  33. package/src/components/variants/ASkeletonForm.vue +32 -0
  34. package/src/components/variants/ASkeletonHeading.vue +47 -0
  35. package/src/components/variants/ASkeletonImage.vue +57 -0
  36. package/src/components/variants/ASkeletonInput.vue +33 -0
  37. package/src/components/variants/ASkeletonListItem.vue +40 -0
  38. package/src/components/variants/ASkeletonTable.vue +49 -0
  39. package/src/components/variants/ASkeletonText.vue +49 -0
  40. package/src/components/variants/ASkeletonVideo.vue +55 -0
  41. package/src/composables/useShapeProbe.ts +33 -9
  42. package/src/composables/useSkeleton.ts +33 -21
  43. package/src/composables/useSkeletonCache.ts +251 -22
  44. package/src/index.ts +48 -2
  45. package/src/nuxt/index.ts +16 -0
  46. package/src/resolver/index.ts +16 -0
  47. package/src/types.ts +118 -2
  48. package/src/utils/buildStructuralSkeleton.ts +400 -103
  49. package/src/utils/captureStyles.ts +378 -0
  50. package/src/utils/domRead.ts +143 -0
  51. package/src/utils/walkDom.ts +261 -16
  52. package/src/utils/walkStructural.ts +418 -0
  53. package/web-types.json +9 -3
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["DEFAULT_MAX_NODES"],"sources":["../../../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../../../../node_modules/.pnpm/tailwind-merge@3.6.0/node_modules/tailwind-merge/dist/bundle-mjs.mjs","../../AUiBase/dist/index.js","../src/utils/walkDom.ts","../src/composables/useShapeProbe.ts","../src/composables/useSkeletonCache.ts","../src/utils/fingerprint.ts","../src/utils/buildStructuralSkeleton.ts","../src/components/StructuralSkeleton.ts","../src/components/ASkeleton.vue","../src/components/ASkeletonLayer.vue","../src/components/ASkeletonBlock.vue","../src/composables/useSkeleton.ts"],"sourcesContent":["function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","/**\n * Concatenates two arrays faster than the array spread operator.\n */\nconst concatArrays = (array1, array2) => {\n // Pre-allocate for better V8 optimization\n const combinedArray = new Array(array1.length + array2.length);\n for (let i = 0; i < array1.length; i++) {\n combinedArray[i] = array1[i];\n }\n for (let i = 0; i < array2.length; i++) {\n combinedArray[array1.length + i] = array2[i];\n }\n return combinedArray;\n};\n\n// Factory function ensures consistent object shapes\nconst createClassValidatorObject = (classGroupId, validator) => ({\n classGroupId,\n validator\n});\n// Factory ensures consistent ClassPartObject shape\nconst createClassPartObject = (nextPart = new Map(), validators = null, classGroupId) => ({\n nextPart,\n validators,\n classGroupId\n});\nconst CLASS_PART_SEPARATOR = '-';\nconst EMPTY_CONFLICTS = [];\n// I use two dots here because one dot is used as prefix for class groups in plugins\nconst ARBITRARY_PROPERTY_PREFIX = 'arbitrary..';\nconst createClassGroupUtils = config => {\n const classMap = createClassMap(config);\n const {\n conflictingClassGroups,\n conflictingClassGroupModifiers\n } = config;\n const getClassGroupId = className => {\n if (className.startsWith('[') && className.endsWith(']')) {\n return getGroupIdForArbitraryProperty(className);\n }\n const classParts = className.split(CLASS_PART_SEPARATOR);\n // Classes like `-inset-1` produce an empty string as first classPart. We assume that classes for negative values are used correctly and skip it.\n const startIndex = classParts[0] === '' && classParts.length > 1 ? 1 : 0;\n return getGroupRecursive(classParts, startIndex, classMap);\n };\n const getConflictingClassGroupIds = (classGroupId, hasPostfixModifier) => {\n if (hasPostfixModifier) {\n const modifierConflicts = conflictingClassGroupModifiers[classGroupId];\n const baseConflicts = conflictingClassGroups[classGroupId];\n if (modifierConflicts) {\n if (baseConflicts) {\n // Merge base conflicts with modifier conflicts\n return concatArrays(baseConflicts, modifierConflicts);\n }\n // Only modifier conflicts\n return modifierConflicts;\n }\n // Fall back to without postfix if no modifier conflicts\n return baseConflicts || EMPTY_CONFLICTS;\n }\n return conflictingClassGroups[classGroupId] || EMPTY_CONFLICTS;\n };\n return {\n getClassGroupId,\n getConflictingClassGroupIds\n };\n};\nconst getGroupRecursive = (classParts, startIndex, classPartObject) => {\n const classPathsLength = classParts.length - startIndex;\n if (classPathsLength === 0) {\n return classPartObject.classGroupId;\n }\n const currentClassPart = classParts[startIndex];\n const nextClassPartObject = classPartObject.nextPart.get(currentClassPart);\n if (nextClassPartObject) {\n const result = getGroupRecursive(classParts, startIndex + 1, nextClassPartObject);\n if (result) return result;\n }\n const validators = classPartObject.validators;\n if (validators === null) {\n return undefined;\n }\n // Build classRest string efficiently by joining from startIndex onwards\n const classRest = startIndex === 0 ? classParts.join(CLASS_PART_SEPARATOR) : classParts.slice(startIndex).join(CLASS_PART_SEPARATOR);\n const validatorsLength = validators.length;\n for (let i = 0; i < validatorsLength; i++) {\n const validatorObj = validators[i];\n if (validatorObj.validator(classRest)) {\n return validatorObj.classGroupId;\n }\n }\n return undefined;\n};\n/**\n * Get the class group ID for an arbitrary property.\n *\n * @param className - The class name to get the group ID for. Is expected to be string starting with `[` and ending with `]`.\n */\nconst getGroupIdForArbitraryProperty = className => className.slice(1, -1).indexOf(':') === -1 ? undefined : (() => {\n const content = className.slice(1, -1);\n const colonIndex = content.indexOf(':');\n const property = content.slice(0, colonIndex);\n return property ? ARBITRARY_PROPERTY_PREFIX + property : undefined;\n})();\n/**\n * Exported for testing only\n */\nconst createClassMap = config => {\n const {\n theme,\n classGroups\n } = config;\n return processClassGroups(classGroups, theme);\n};\n// Split into separate functions to maintain monomorphic call sites\nconst processClassGroups = (classGroups, theme) => {\n const classMap = createClassPartObject();\n for (const classGroupId in classGroups) {\n const group = classGroups[classGroupId];\n processClassesRecursively(group, classMap, classGroupId, theme);\n }\n return classMap;\n};\nconst processClassesRecursively = (classGroup, classPartObject, classGroupId, theme) => {\n const len = classGroup.length;\n for (let i = 0; i < len; i++) {\n const classDefinition = classGroup[i];\n processClassDefinition(classDefinition, classPartObject, classGroupId, theme);\n }\n};\n// Split into separate functions for each type to maintain monomorphic call sites\nconst processClassDefinition = (classDefinition, classPartObject, classGroupId, theme) => {\n if (typeof classDefinition === 'string') {\n processStringDefinition(classDefinition, classPartObject, classGroupId);\n return;\n }\n if (typeof classDefinition === 'function') {\n processFunctionDefinition(classDefinition, classPartObject, classGroupId, theme);\n return;\n }\n processObjectDefinition(classDefinition, classPartObject, classGroupId, theme);\n};\nconst processStringDefinition = (classDefinition, classPartObject, classGroupId) => {\n const classPartObjectToEdit = classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition);\n classPartObjectToEdit.classGroupId = classGroupId;\n};\nconst processFunctionDefinition = (classDefinition, classPartObject, classGroupId, theme) => {\n if (isThemeGetter(classDefinition)) {\n processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme);\n return;\n }\n if (classPartObject.validators === null) {\n classPartObject.validators = [];\n }\n classPartObject.validators.push(createClassValidatorObject(classGroupId, classDefinition));\n};\nconst processObjectDefinition = (classDefinition, classPartObject, classGroupId, theme) => {\n const entries = Object.entries(classDefinition);\n const len = entries.length;\n for (let i = 0; i < len; i++) {\n const [key, value] = entries[i];\n processClassesRecursively(value, getPart(classPartObject, key), classGroupId, theme);\n }\n};\nconst getPart = (classPartObject, path) => {\n let current = classPartObject;\n const parts = path.split(CLASS_PART_SEPARATOR);\n const len = parts.length;\n for (let i = 0; i < len; i++) {\n const part = parts[i];\n let next = current.nextPart.get(part);\n if (!next) {\n next = createClassPartObject();\n current.nextPart.set(part, next);\n }\n current = next;\n }\n return current;\n};\n// Type guard maintains monomorphic check\nconst isThemeGetter = func => 'isThemeGetter' in func && func.isThemeGetter === true;\n\n// LRU cache implementation using plain objects for simplicity\nconst createLruCache = maxCacheSize => {\n if (maxCacheSize < 1) {\n return {\n get: () => undefined,\n set: () => {}\n };\n }\n let cacheSize = 0;\n let cache = Object.create(null);\n let previousCache = Object.create(null);\n const update = (key, value) => {\n cache[key] = value;\n cacheSize++;\n if (cacheSize > maxCacheSize) {\n cacheSize = 0;\n previousCache = cache;\n cache = Object.create(null);\n }\n };\n return {\n get(key) {\n let value = cache[key];\n if (value !== undefined) {\n return value;\n }\n if ((value = previousCache[key]) !== undefined) {\n update(key, value);\n return value;\n }\n },\n set(key, value) {\n if (key in cache) {\n cache[key] = value;\n } else {\n update(key, value);\n }\n }\n };\n};\nconst IMPORTANT_MODIFIER = '!';\nconst MODIFIER_SEPARATOR = ':';\nconst EMPTY_MODIFIERS = [];\n// Pre-allocated result object shape for consistency\nconst createResultObject = (modifiers, hasImportantModifier, baseClassName, maybePostfixModifierPosition, isExternal) => ({\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition,\n isExternal\n});\nconst createParseClassName = config => {\n const {\n prefix,\n experimentalParseClassName\n } = config;\n /**\n * Parse class name into parts.\n *\n * Inspired by `splitAtTopLevelOnly` used in Tailwind CSS\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v3.2.2/src/util/splitAtTopLevelOnly.js\n */\n let parseClassName = className => {\n // Use simple array with push for better performance\n const modifiers = [];\n let bracketDepth = 0;\n let parenDepth = 0;\n let modifierStart = 0;\n let postfixModifierPosition;\n const len = className.length;\n for (let index = 0; index < len; index++) {\n const currentCharacter = className[index];\n if (bracketDepth === 0 && parenDepth === 0) {\n if (currentCharacter === MODIFIER_SEPARATOR) {\n modifiers.push(className.slice(modifierStart, index));\n modifierStart = index + 1;\n continue;\n }\n if (currentCharacter === '/') {\n postfixModifierPosition = index;\n continue;\n }\n }\n if (currentCharacter === '[') bracketDepth++;else if (currentCharacter === ']') bracketDepth--;else if (currentCharacter === '(') parenDepth++;else if (currentCharacter === ')') parenDepth--;\n }\n const baseClassNameWithImportantModifier = modifiers.length === 0 ? className : className.slice(modifierStart);\n // Inline important modifier check\n let baseClassName = baseClassNameWithImportantModifier;\n let hasImportantModifier = false;\n if (baseClassNameWithImportantModifier.endsWith(IMPORTANT_MODIFIER)) {\n baseClassName = baseClassNameWithImportantModifier.slice(0, -1);\n hasImportantModifier = true;\n } else if (\n /**\n * In Tailwind CSS v3 the important modifier was at the start of the base class name. This is still supported for legacy reasons.\n * @see https://github.com/dcastil/tailwind-merge/issues/513#issuecomment-2614029864\n */\n baseClassNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER)) {\n baseClassName = baseClassNameWithImportantModifier.slice(1);\n hasImportantModifier = true;\n }\n const maybePostfixModifierPosition = postfixModifierPosition && postfixModifierPosition > modifierStart ? postfixModifierPosition - modifierStart : undefined;\n return createResultObject(modifiers, hasImportantModifier, baseClassName, maybePostfixModifierPosition);\n };\n if (prefix) {\n const fullPrefix = prefix + MODIFIER_SEPARATOR;\n const parseClassNameOriginal = parseClassName;\n parseClassName = className => className.startsWith(fullPrefix) ? parseClassNameOriginal(className.slice(fullPrefix.length)) : createResultObject(EMPTY_MODIFIERS, false, className, undefined, true);\n }\n if (experimentalParseClassName) {\n const parseClassNameOriginal = parseClassName;\n parseClassName = className => experimentalParseClassName({\n className,\n parseClassName: parseClassNameOriginal\n });\n }\n return parseClassName;\n};\n\n/**\n * Sorts modifiers according to following schema:\n * - Predefined modifiers are sorted alphabetically\n * - When an arbitrary variant appears, it must be preserved which modifiers are before and after it\n */\nconst createSortModifiers = config => {\n // Pre-compute weights for all known modifiers for O(1) comparison\n const modifierWeights = new Map();\n // Assign weights to sensitive modifiers (highest priority, but preserve order)\n config.orderSensitiveModifiers.forEach((mod, index) => {\n modifierWeights.set(mod, 1000000 + index); // High weights for sensitive mods\n });\n return modifiers => {\n const result = [];\n let currentSegment = [];\n // Process modifiers in one pass\n for (let i = 0; i < modifiers.length; i++) {\n const modifier = modifiers[i];\n // Check if modifier is sensitive (starts with '[' or in orderSensitiveModifiers)\n const isArbitrary = modifier[0] === '[';\n const isOrderSensitive = modifierWeights.has(modifier);\n if (isArbitrary || isOrderSensitive) {\n // Sort and flush current segment alphabetically\n if (currentSegment.length > 0) {\n currentSegment.sort();\n result.push(...currentSegment);\n currentSegment = [];\n }\n result.push(modifier);\n } else {\n // Regular modifier - add to current segment for batch sorting\n currentSegment.push(modifier);\n }\n }\n // Sort and add any remaining segment items\n if (currentSegment.length > 0) {\n currentSegment.sort();\n result.push(...currentSegment);\n }\n return result;\n };\n};\nconst createConfigUtils = config => ({\n cache: createLruCache(config.cacheSize),\n parseClassName: createParseClassName(config),\n sortModifiers: createSortModifiers(config),\n postfixLookupClassGroupIds: createPostfixLookupClassGroupIds(config),\n ...createClassGroupUtils(config)\n});\nconst createPostfixLookupClassGroupIds = config => {\n const lookup = Object.create(null);\n const classGroupIds = config.postfixLookupClassGroups;\n if (classGroupIds) {\n for (let i = 0; i < classGroupIds.length; i++) {\n lookup[classGroupIds[i]] = true;\n }\n }\n return lookup;\n};\nconst SPLIT_CLASSES_REGEX = /\\s+/;\nconst mergeClassList = (classList, configUtils) => {\n const {\n parseClassName,\n getClassGroupId,\n getConflictingClassGroupIds,\n sortModifiers,\n postfixLookupClassGroupIds\n } = configUtils;\n /**\n * Set of classGroupIds in following format:\n * `{importantModifier}{variantModifiers}{classGroupId}`\n * @example 'float'\n * @example 'hover:focus:bg-color'\n * @example 'md:!pr'\n */\n const classGroupsInConflict = [];\n const classNames = classList.trim().split(SPLIT_CLASSES_REGEX);\n let result = '';\n for (let index = classNames.length - 1; index >= 0; index -= 1) {\n const originalClassName = classNames[index];\n const {\n isExternal,\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition\n } = parseClassName(originalClassName);\n if (isExternal) {\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n let hasPostfixModifier = !!maybePostfixModifierPosition;\n let classGroupId;\n if (hasPostfixModifier) {\n const baseClassNameWithoutPostfix = baseClassName.substring(0, maybePostfixModifierPosition);\n classGroupId = getClassGroupId(baseClassNameWithoutPostfix);\n const classGroupIdWithPostfix = classGroupId && postfixLookupClassGroupIds[classGroupId] ? getClassGroupId(baseClassName) : undefined;\n if (classGroupIdWithPostfix && classGroupIdWithPostfix !== classGroupId) {\n classGroupId = classGroupIdWithPostfix;\n hasPostfixModifier = false;\n }\n } else {\n classGroupId = getClassGroupId(baseClassName);\n }\n if (!classGroupId) {\n if (!hasPostfixModifier) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n classGroupId = getClassGroupId(baseClassName);\n if (!classGroupId) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n hasPostfixModifier = false;\n }\n // Fast path: skip sorting for empty or single modifier\n const variantModifier = modifiers.length === 0 ? '' : modifiers.length === 1 ? modifiers[0] : sortModifiers(modifiers).join(':');\n const modifierId = hasImportantModifier ? variantModifier + IMPORTANT_MODIFIER : variantModifier;\n const classId = modifierId + classGroupId;\n if (classGroupsInConflict.indexOf(classId) > -1) {\n // Tailwind class omitted due to conflict\n continue;\n }\n classGroupsInConflict.push(classId);\n const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier);\n for (let i = 0; i < conflictGroups.length; ++i) {\n const group = conflictGroups[i];\n classGroupsInConflict.push(modifierId + group);\n }\n // Tailwind class not in conflict\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n }\n return result;\n};\n\n/**\n * The code in this file is copied from https://github.com/lukeed/clsx and modified to suit the needs of tailwind-merge better.\n *\n * Specifically:\n * - Runtime code from https://github.com/lukeed/clsx/blob/v1.2.1/src/index.js\n * - TypeScript types from https://github.com/lukeed/clsx/blob/v1.2.1/clsx.d.ts\n *\n * Original code has MIT license: Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)\n */\nconst twJoin = (...classLists) => {\n let index = 0;\n let argument;\n let resolvedValue;\n let string = '';\n while (index < classLists.length) {\n if (argument = classLists[index++]) {\n if (resolvedValue = toValue(argument)) {\n string && (string += ' ');\n string += resolvedValue;\n }\n }\n }\n return string;\n};\nconst toValue = mix => {\n // Fast path for strings\n if (typeof mix === 'string') {\n return mix;\n }\n let resolvedValue;\n let string = '';\n for (let k = 0; k < mix.length; k++) {\n if (mix[k]) {\n if (resolvedValue = toValue(mix[k])) {\n string && (string += ' ');\n string += resolvedValue;\n }\n }\n }\n return string;\n};\nconst createTailwindMerge = (createConfigFirst, ...createConfigRest) => {\n let configUtils;\n let cacheGet;\n let cacheSet;\n let functionToCall;\n const initTailwindMerge = classList => {\n const config = createConfigRest.reduce((previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig), createConfigFirst());\n configUtils = createConfigUtils(config);\n cacheGet = configUtils.cache.get;\n cacheSet = configUtils.cache.set;\n functionToCall = tailwindMerge;\n return tailwindMerge(classList);\n };\n const tailwindMerge = classList => {\n const cachedResult = cacheGet(classList);\n if (cachedResult) {\n return cachedResult;\n }\n const result = mergeClassList(classList, configUtils);\n cacheSet(classList, result);\n return result;\n };\n functionToCall = initTailwindMerge;\n return (...args) => functionToCall(twJoin(...args));\n};\nconst fallbackThemeArr = [];\nconst fromTheme = key => {\n const themeGetter = theme => theme[key] || fallbackThemeArr;\n themeGetter.isThemeGetter = true;\n return themeGetter;\n};\nconst arbitraryValueRegex = /^\\[(?:(\\w[\\w-]*):)?(.+)\\]$/i;\nconst arbitraryVariableRegex = /^\\((?:(\\w[\\w-]*):)?(.+)\\)$/i;\nconst fractionRegex = /^\\d+(?:\\.\\d+)?\\/\\d+(?:\\.\\d+)?$/;\nconst tshirtUnitRegex = /^(\\d+(\\.\\d+)?)?(xs|sm|md|lg|xl)$/;\nconst 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$/;\nconst colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\\(.+\\)$/;\n// Shadow always begins with x and y offset separated by underscore optionally prepended by inset\nconst shadowRegex = /^(inset_)?-?((\\d+)?\\.?(\\d+)[a-z]+|0)_-?((\\d+)?\\.?(\\d+)[a-z]+|0)/;\nconst imageRegex = /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\\(.+\\)$/;\nconst isFraction = value => fractionRegex.test(value);\nconst isNumber = value => !!value && !Number.isNaN(Number(value));\nconst isInteger = value => !!value && Number.isInteger(Number(value));\nconst isPercent = value => value.endsWith('%') && isNumber(value.slice(0, -1));\nconst isTshirtSize = value => tshirtUnitRegex.test(value);\nconst isAny = () => true;\nconst isLengthOnly = value =>\n// `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.\n// For example, `hsl(0 0% 0%)` would be classified as a length without this check.\n// I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.\nlengthUnitRegex.test(value) && !colorFunctionRegex.test(value);\nconst isNever = () => false;\nconst isShadow = value => shadowRegex.test(value);\nconst isImage = value => imageRegex.test(value);\nconst isAnyNonArbitrary = value => !isArbitraryValue(value) && !isArbitraryVariable(value);\nconst isNamedContainerQuery = value => value.startsWith('@container') && (value[10] === '/' && value[11] !== undefined || value[11] === 's' && value[16] !== undefined && value.startsWith('-size/', 10) || value[11] === 'n' && value[18] !== undefined && value.startsWith('-normal/', 10));\nconst isArbitrarySize = value => getIsArbitraryValue(value, isLabelSize, isNever);\nconst isArbitraryValue = value => arbitraryValueRegex.test(value);\nconst isArbitraryLength = value => getIsArbitraryValue(value, isLabelLength, isLengthOnly);\nconst isArbitraryNumber = value => getIsArbitraryValue(value, isLabelNumber, isNumber);\nconst isArbitraryWeight = value => getIsArbitraryValue(value, isLabelWeight, isAny);\nconst isArbitraryFamilyName = value => getIsArbitraryValue(value, isLabelFamilyName, isNever);\nconst isArbitraryPosition = value => getIsArbitraryValue(value, isLabelPosition, isNever);\nconst isArbitraryImage = value => getIsArbitraryValue(value, isLabelImage, isImage);\nconst isArbitraryShadow = value => getIsArbitraryValue(value, isLabelShadow, isShadow);\nconst isArbitraryVariable = value => arbitraryVariableRegex.test(value);\nconst isArbitraryVariableLength = value => getIsArbitraryVariable(value, isLabelLength);\nconst isArbitraryVariableFamilyName = value => getIsArbitraryVariable(value, isLabelFamilyName);\nconst isArbitraryVariablePosition = value => getIsArbitraryVariable(value, isLabelPosition);\nconst isArbitraryVariableSize = value => getIsArbitraryVariable(value, isLabelSize);\nconst isArbitraryVariableImage = value => getIsArbitraryVariable(value, isLabelImage);\nconst isArbitraryVariableShadow = value => getIsArbitraryVariable(value, isLabelShadow, true);\nconst isArbitraryVariableWeight = value => getIsArbitraryVariable(value, isLabelWeight, true);\n// Helpers\nconst getIsArbitraryValue = (value, testLabel, testValue) => {\n const result = arbitraryValueRegex.exec(value);\n if (result) {\n if (result[1]) {\n return testLabel(result[1]);\n }\n return testValue(result[2]);\n }\n return false;\n};\nconst getIsArbitraryVariable = (value, testLabel, shouldMatchNoLabel = false) => {\n const result = arbitraryVariableRegex.exec(value);\n if (result) {\n if (result[1]) {\n return testLabel(result[1]);\n }\n return shouldMatchNoLabel;\n }\n return false;\n};\n// Labels\nconst isLabelPosition = label => label === 'position' || label === 'percentage';\nconst isLabelImage = label => label === 'image' || label === 'url';\nconst isLabelSize = label => label === 'length' || label === 'size' || label === 'bg-size';\nconst isLabelLength = label => label === 'length';\nconst isLabelNumber = label => label === 'number';\nconst isLabelFamilyName = label => label === 'family-name';\nconst isLabelWeight = label => label === 'number' || label === 'weight';\nconst isLabelShadow = label => label === 'shadow';\nconst validators = /*#__PURE__*/Object.defineProperty({\n __proto__: null,\n isAny,\n isAnyNonArbitrary,\n isArbitraryFamilyName,\n isArbitraryImage,\n isArbitraryLength,\n isArbitraryNumber,\n isArbitraryPosition,\n isArbitraryShadow,\n isArbitrarySize,\n isArbitraryValue,\n isArbitraryVariable,\n isArbitraryVariableFamilyName,\n isArbitraryVariableImage,\n isArbitraryVariableLength,\n isArbitraryVariablePosition,\n isArbitraryVariableShadow,\n isArbitraryVariableSize,\n isArbitraryVariableWeight,\n isArbitraryWeight,\n isFraction,\n isInteger,\n isNamedContainerQuery,\n isNumber,\n isPercent,\n isTshirtSize\n}, Symbol.toStringTag, {\n value: 'Module'\n});\nconst getDefaultConfig = () => {\n /**\n * Theme getters for theme variable namespaces\n * @see https://tailwindcss.com/docs/theme#theme-variable-namespaces\n */\n /***/\n const themeColor = fromTheme('color');\n const themeFont = fromTheme('font');\n const themeText = fromTheme('text');\n const themeFontWeight = fromTheme('font-weight');\n const themeTracking = fromTheme('tracking');\n const themeLeading = fromTheme('leading');\n const themeBreakpoint = fromTheme('breakpoint');\n const themeContainer = fromTheme('container');\n const themeSpacing = fromTheme('spacing');\n const themeRadius = fromTheme('radius');\n const themeShadow = fromTheme('shadow');\n const themeInsetShadow = fromTheme('inset-shadow');\n const themeTextShadow = fromTheme('text-shadow');\n const themeDropShadow = fromTheme('drop-shadow');\n const themeBlur = fromTheme('blur');\n const themePerspective = fromTheme('perspective');\n const themeAspect = fromTheme('aspect');\n const themeEase = fromTheme('ease');\n const themeAnimate = fromTheme('animate');\n /**\n * Helpers to avoid repeating the same scales\n *\n * We use functions that create a new array every time they're called instead of static arrays.\n * 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.\n */\n /***/\n const scaleBreak = () => ['auto', 'avoid', 'all', 'avoid-page', 'page', 'left', 'right', 'column'];\n const scalePosition = () => ['center', 'top', 'bottom', 'left', 'right', 'top-left',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'left-top', 'top-right',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'right-top', 'bottom-right',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'right-bottom', 'bottom-left',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'left-bottom'];\n const scalePositionWithArbitrary = () => [...scalePosition(), isArbitraryVariable, isArbitraryValue];\n const scaleOverflow = () => ['auto', 'hidden', 'clip', 'visible', 'scroll'];\n const scaleOverscroll = () => ['auto', 'contain', 'none'];\n const scaleUnambiguousSpacing = () => [isArbitraryVariable, isArbitraryValue, themeSpacing];\n const scaleInset = () => [isFraction, 'full', 'auto', ...scaleUnambiguousSpacing()];\n const scaleGridTemplateColsRows = () => [isInteger, 'none', 'subgrid', isArbitraryVariable, isArbitraryValue];\n const scaleGridColRowStartAndEnd = () => ['auto', {\n span: ['full', isInteger, isArbitraryVariable, isArbitraryValue]\n }, isInteger, isArbitraryVariable, isArbitraryValue];\n const scaleGridColRowStartOrEnd = () => [isInteger, 'auto', isArbitraryVariable, isArbitraryValue];\n const scaleGridAutoColsRows = () => ['auto', 'min', 'max', 'fr', isArbitraryVariable, isArbitraryValue];\n const scaleAlignPrimaryAxis = () => ['start', 'end', 'center', 'between', 'around', 'evenly', 'stretch', 'baseline', 'center-safe', 'end-safe'];\n const scaleAlignSecondaryAxis = () => ['start', 'end', 'center', 'stretch', 'center-safe', 'end-safe'];\n const scaleMargin = () => ['auto', ...scaleUnambiguousSpacing()];\n const scaleSizing = () => [isFraction, 'auto', 'full', 'dvw', 'dvh', 'lvw', 'lvh', 'svw', 'svh', 'min', 'max', 'fit', ...scaleUnambiguousSpacing()];\n const scaleSizingInline = () => [isFraction, 'screen', 'full', 'dvw', 'lvw', 'svw', 'min', 'max', 'fit', ...scaleUnambiguousSpacing()];\n const scaleSizingBlock = () => [isFraction, 'screen', 'full', 'lh', 'dvh', 'lvh', 'svh', 'min', 'max', 'fit', ...scaleUnambiguousSpacing()];\n const scaleColor = () => [themeColor, isArbitraryVariable, isArbitraryValue];\n const scaleBgPosition = () => [...scalePosition(), isArbitraryVariablePosition, isArbitraryPosition, {\n position: [isArbitraryVariable, isArbitraryValue]\n }];\n const scaleBgRepeat = () => ['no-repeat', {\n repeat: ['', 'x', 'y', 'space', 'round']\n }];\n const scaleBgSize = () => ['auto', 'cover', 'contain', isArbitraryVariableSize, isArbitrarySize, {\n size: [isArbitraryVariable, isArbitraryValue]\n }];\n const scaleGradientStopPosition = () => [isPercent, isArbitraryVariableLength, isArbitraryLength];\n const scaleRadius = () => [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', 'full', themeRadius, isArbitraryVariable, isArbitraryValue];\n const scaleBorderWidth = () => ['', isNumber, isArbitraryVariableLength, isArbitraryLength];\n const scaleLineStyle = () => ['solid', 'dashed', 'dotted', 'double'];\n const scaleBlendMode = () => ['normal', 'multiply', 'screen', 'overlay', 'darken', 'lighten', 'color-dodge', 'color-burn', 'hard-light', 'soft-light', 'difference', 'exclusion', 'hue', 'saturation', 'color', 'luminosity'];\n const scaleMaskImagePosition = () => [isNumber, isPercent, isArbitraryVariablePosition, isArbitraryPosition];\n const scaleBlur = () => [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', themeBlur, isArbitraryVariable, isArbitraryValue];\n const scaleRotate = () => ['none', isNumber, isArbitraryVariable, isArbitraryValue];\n const scaleScale = () => ['none', isNumber, isArbitraryVariable, isArbitraryValue];\n const scaleSkew = () => [isNumber, isArbitraryVariable, isArbitraryValue];\n const scaleTranslate = () => [isFraction, 'full', ...scaleUnambiguousSpacing()];\n return {\n cacheSize: 500,\n theme: {\n animate: ['spin', 'ping', 'pulse', 'bounce'],\n aspect: ['video'],\n blur: [isTshirtSize],\n breakpoint: [isTshirtSize],\n color: [isAny],\n container: [isTshirtSize],\n 'drop-shadow': [isTshirtSize],\n ease: ['in', 'out', 'in-out'],\n font: [isAnyNonArbitrary],\n 'font-weight': ['thin', 'extralight', 'light', 'normal', 'medium', 'semibold', 'bold', 'extrabold', 'black'],\n 'inset-shadow': [isTshirtSize],\n leading: ['none', 'tight', 'snug', 'normal', 'relaxed', 'loose'],\n perspective: ['dramatic', 'near', 'normal', 'midrange', 'distant', 'none'],\n radius: [isTshirtSize],\n shadow: [isTshirtSize],\n spacing: ['px', isNumber],\n text: [isTshirtSize],\n 'text-shadow': [isTshirtSize],\n tracking: ['tighter', 'tight', 'normal', 'wide', 'wider', 'widest']\n },\n classGroups: {\n // --------------\n // --- Layout ---\n // --------------\n /**\n * Aspect Ratio\n * @see https://tailwindcss.com/docs/aspect-ratio\n */\n aspect: [{\n aspect: ['auto', 'square', isFraction, isArbitraryValue, isArbitraryVariable, themeAspect]\n }],\n /**\n * Container\n * @see https://tailwindcss.com/docs/container\n * @deprecated since Tailwind CSS v4.0.0\n */\n container: ['container'],\n /**\n * Container Type\n * @see https://tailwindcss.com/docs/responsive-design#container-queries\n */\n 'container-type': [{\n '@container': ['', 'normal', 'size', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Container Name\n * @see https://tailwindcss.com/docs/responsive-design#named-containers\n */\n 'container-named': [isNamedContainerQuery],\n /**\n * Columns\n * @see https://tailwindcss.com/docs/columns\n */\n columns: [{\n columns: [isNumber, isArbitraryValue, isArbitraryVariable, themeContainer]\n }],\n /**\n * Break After\n * @see https://tailwindcss.com/docs/break-after\n */\n 'break-after': [{\n 'break-after': scaleBreak()\n }],\n /**\n * Break Before\n * @see https://tailwindcss.com/docs/break-before\n */\n 'break-before': [{\n 'break-before': scaleBreak()\n }],\n /**\n * Break Inside\n * @see https://tailwindcss.com/docs/break-inside\n */\n 'break-inside': [{\n 'break-inside': ['auto', 'avoid', 'avoid-page', 'avoid-column']\n }],\n /**\n * Box Decoration Break\n * @see https://tailwindcss.com/docs/box-decoration-break\n */\n 'box-decoration': [{\n 'box-decoration': ['slice', 'clone']\n }],\n /**\n * Box Sizing\n * @see https://tailwindcss.com/docs/box-sizing\n */\n box: [{\n box: ['border', 'content']\n }],\n /**\n * Display\n * @see https://tailwindcss.com/docs/display\n */\n display: ['block', 'inline-block', 'inline', 'flex', 'inline-flex', 'table', 'inline-table', 'table-caption', 'table-cell', 'table-column', 'table-column-group', 'table-footer-group', 'table-header-group', 'table-row-group', 'table-row', 'flow-root', 'grid', 'inline-grid', 'contents', 'list-item', 'hidden'],\n /**\n * Screen Reader Only\n * @see https://tailwindcss.com/docs/display#screen-reader-only\n */\n sr: ['sr-only', 'not-sr-only'],\n /**\n * Floats\n * @see https://tailwindcss.com/docs/float\n */\n float: [{\n float: ['right', 'left', 'none', 'start', 'end']\n }],\n /**\n * Clear\n * @see https://tailwindcss.com/docs/clear\n */\n clear: [{\n clear: ['left', 'right', 'both', 'none', 'start', 'end']\n }],\n /**\n * Isolation\n * @see https://tailwindcss.com/docs/isolation\n */\n isolation: ['isolate', 'isolation-auto'],\n /**\n * Object Fit\n * @see https://tailwindcss.com/docs/object-fit\n */\n 'object-fit': [{\n object: ['contain', 'cover', 'fill', 'none', 'scale-down']\n }],\n /**\n * Object Position\n * @see https://tailwindcss.com/docs/object-position\n */\n 'object-position': [{\n object: scalePositionWithArbitrary()\n }],\n /**\n * Overflow\n * @see https://tailwindcss.com/docs/overflow\n */\n overflow: [{\n overflow: scaleOverflow()\n }],\n /**\n * Overflow X\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-x': [{\n 'overflow-x': scaleOverflow()\n }],\n /**\n * Overflow Y\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-y': [{\n 'overflow-y': scaleOverflow()\n }],\n /**\n * Overscroll Behavior\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n overscroll: [{\n overscroll: scaleOverscroll()\n }],\n /**\n * Overscroll Behavior X\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-x': [{\n 'overscroll-x': scaleOverscroll()\n }],\n /**\n * Overscroll Behavior Y\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-y': [{\n 'overscroll-y': scaleOverscroll()\n }],\n /**\n * Position\n * @see https://tailwindcss.com/docs/position\n */\n position: ['static', 'fixed', 'absolute', 'relative', 'sticky'],\n /**\n * Inset\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n inset: [{\n inset: scaleInset()\n }],\n /**\n * Inset Inline\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-x': [{\n 'inset-x': scaleInset()\n }],\n /**\n * Inset Block\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-y': [{\n 'inset-y': scaleInset()\n }],\n /**\n * Inset Inline Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n * @todo class group will be renamed to `inset-s` in next major release\n */\n start: [{\n 'inset-s': scaleInset(),\n /**\n * @deprecated since Tailwind CSS v4.2.0 in favor of `inset-s-*` utilities.\n * @see https://github.com/tailwindlabs/tailwindcss/pull/19613\n */\n start: scaleInset()\n }],\n /**\n * Inset Inline End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n * @todo class group will be renamed to `inset-e` in next major release\n */\n end: [{\n 'inset-e': scaleInset(),\n /**\n * @deprecated since Tailwind CSS v4.2.0 in favor of `inset-e-*` utilities.\n * @see https://github.com/tailwindlabs/tailwindcss/pull/19613\n */\n end: scaleInset()\n }],\n /**\n * Inset Block Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-bs': [{\n 'inset-bs': scaleInset()\n }],\n /**\n * Inset Block End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-be': [{\n 'inset-be': scaleInset()\n }],\n /**\n * Top\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n top: [{\n top: scaleInset()\n }],\n /**\n * Right\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n right: [{\n right: scaleInset()\n }],\n /**\n * Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n bottom: [{\n bottom: scaleInset()\n }],\n /**\n * Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n left: [{\n left: scaleInset()\n }],\n /**\n * Visibility\n * @see https://tailwindcss.com/docs/visibility\n */\n visibility: ['visible', 'invisible', 'collapse'],\n /**\n * Z-Index\n * @see https://tailwindcss.com/docs/z-index\n */\n z: [{\n z: [isInteger, 'auto', isArbitraryVariable, isArbitraryValue]\n }],\n // ------------------------\n // --- Flexbox and Grid ---\n // ------------------------\n /**\n * Flex Basis\n * @see https://tailwindcss.com/docs/flex-basis\n */\n basis: [{\n basis: [isFraction, 'full', 'auto', themeContainer, ...scaleUnambiguousSpacing()]\n }],\n /**\n * Flex Direction\n * @see https://tailwindcss.com/docs/flex-direction\n */\n 'flex-direction': [{\n flex: ['row', 'row-reverse', 'col', 'col-reverse']\n }],\n /**\n * Flex Wrap\n * @see https://tailwindcss.com/docs/flex-wrap\n */\n 'flex-wrap': [{\n flex: ['nowrap', 'wrap', 'wrap-reverse']\n }],\n /**\n * Flex\n * @see https://tailwindcss.com/docs/flex\n */\n flex: [{\n flex: [isNumber, isFraction, 'auto', 'initial', 'none', isArbitraryValue]\n }],\n /**\n * Flex Grow\n * @see https://tailwindcss.com/docs/flex-grow\n */\n grow: [{\n grow: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Flex Shrink\n * @see https://tailwindcss.com/docs/flex-shrink\n */\n shrink: [{\n shrink: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Order\n * @see https://tailwindcss.com/docs/order\n */\n order: [{\n order: [isInteger, 'first', 'last', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Grid Template Columns\n * @see https://tailwindcss.com/docs/grid-template-columns\n */\n 'grid-cols': [{\n 'grid-cols': scaleGridTemplateColsRows()\n }],\n /**\n * Grid Column Start / End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start-end': [{\n col: scaleGridColRowStartAndEnd()\n }],\n /**\n * Grid Column Start\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start': [{\n 'col-start': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Column End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-end': [{\n 'col-end': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Template Rows\n * @see https://tailwindcss.com/docs/grid-template-rows\n */\n 'grid-rows': [{\n 'grid-rows': scaleGridTemplateColsRows()\n }],\n /**\n * Grid Row Start / End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start-end': [{\n row: scaleGridColRowStartAndEnd()\n }],\n /**\n * Grid Row Start\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start': [{\n 'row-start': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Row End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-end': [{\n 'row-end': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Auto Flow\n * @see https://tailwindcss.com/docs/grid-auto-flow\n */\n 'grid-flow': [{\n 'grid-flow': ['row', 'col', 'dense', 'row-dense', 'col-dense']\n }],\n /**\n * Grid Auto Columns\n * @see https://tailwindcss.com/docs/grid-auto-columns\n */\n 'auto-cols': [{\n 'auto-cols': scaleGridAutoColsRows()\n }],\n /**\n * Grid Auto Rows\n * @see https://tailwindcss.com/docs/grid-auto-rows\n */\n 'auto-rows': [{\n 'auto-rows': scaleGridAutoColsRows()\n }],\n /**\n * Gap\n * @see https://tailwindcss.com/docs/gap\n */\n gap: [{\n gap: scaleUnambiguousSpacing()\n }],\n /**\n * Gap X\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-x': [{\n 'gap-x': scaleUnambiguousSpacing()\n }],\n /**\n * Gap Y\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-y': [{\n 'gap-y': scaleUnambiguousSpacing()\n }],\n /**\n * Justify Content\n * @see https://tailwindcss.com/docs/justify-content\n */\n 'justify-content': [{\n justify: [...scaleAlignPrimaryAxis(), 'normal']\n }],\n /**\n * Justify Items\n * @see https://tailwindcss.com/docs/justify-items\n */\n 'justify-items': [{\n 'justify-items': [...scaleAlignSecondaryAxis(), 'normal']\n }],\n /**\n * Justify Self\n * @see https://tailwindcss.com/docs/justify-self\n */\n 'justify-self': [{\n 'justify-self': ['auto', ...scaleAlignSecondaryAxis()]\n }],\n /**\n * Align Content\n * @see https://tailwindcss.com/docs/align-content\n */\n 'align-content': [{\n content: ['normal', ...scaleAlignPrimaryAxis()]\n }],\n /**\n * Align Items\n * @see https://tailwindcss.com/docs/align-items\n */\n 'align-items': [{\n items: [...scaleAlignSecondaryAxis(), {\n baseline: ['', 'last']\n }]\n }],\n /**\n * Align Self\n * @see https://tailwindcss.com/docs/align-self\n */\n 'align-self': [{\n self: ['auto', ...scaleAlignSecondaryAxis(), {\n baseline: ['', 'last']\n }]\n }],\n /**\n * Place Content\n * @see https://tailwindcss.com/docs/place-content\n */\n 'place-content': [{\n 'place-content': scaleAlignPrimaryAxis()\n }],\n /**\n * Place Items\n * @see https://tailwindcss.com/docs/place-items\n */\n 'place-items': [{\n 'place-items': [...scaleAlignSecondaryAxis(), 'baseline']\n }],\n /**\n * Place Self\n * @see https://tailwindcss.com/docs/place-self\n */\n 'place-self': [{\n 'place-self': ['auto', ...scaleAlignSecondaryAxis()]\n }],\n // Spacing\n /**\n * Padding\n * @see https://tailwindcss.com/docs/padding\n */\n p: [{\n p: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Inline\n * @see https://tailwindcss.com/docs/padding\n */\n px: [{\n px: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Block\n * @see https://tailwindcss.com/docs/padding\n */\n py: [{\n py: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Inline Start\n * @see https://tailwindcss.com/docs/padding\n */\n ps: [{\n ps: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Inline End\n * @see https://tailwindcss.com/docs/padding\n */\n pe: [{\n pe: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Block Start\n * @see https://tailwindcss.com/docs/padding\n */\n pbs: [{\n pbs: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Block End\n * @see https://tailwindcss.com/docs/padding\n */\n pbe: [{\n pbe: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Top\n * @see https://tailwindcss.com/docs/padding\n */\n pt: [{\n pt: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Right\n * @see https://tailwindcss.com/docs/padding\n */\n pr: [{\n pr: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Bottom\n * @see https://tailwindcss.com/docs/padding\n */\n pb: [{\n pb: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Left\n * @see https://tailwindcss.com/docs/padding\n */\n pl: [{\n pl: scaleUnambiguousSpacing()\n }],\n /**\n * Margin\n * @see https://tailwindcss.com/docs/margin\n */\n m: [{\n m: scaleMargin()\n }],\n /**\n * Margin Inline\n * @see https://tailwindcss.com/docs/margin\n */\n mx: [{\n mx: scaleMargin()\n }],\n /**\n * Margin Block\n * @see https://tailwindcss.com/docs/margin\n */\n my: [{\n my: scaleMargin()\n }],\n /**\n * Margin Inline Start\n * @see https://tailwindcss.com/docs/margin\n */\n ms: [{\n ms: scaleMargin()\n }],\n /**\n * Margin Inline End\n * @see https://tailwindcss.com/docs/margin\n */\n me: [{\n me: scaleMargin()\n }],\n /**\n * Margin Block Start\n * @see https://tailwindcss.com/docs/margin\n */\n mbs: [{\n mbs: scaleMargin()\n }],\n /**\n * Margin Block End\n * @see https://tailwindcss.com/docs/margin\n */\n mbe: [{\n mbe: scaleMargin()\n }],\n /**\n * Margin Top\n * @see https://tailwindcss.com/docs/margin\n */\n mt: [{\n mt: scaleMargin()\n }],\n /**\n * Margin Right\n * @see https://tailwindcss.com/docs/margin\n */\n mr: [{\n mr: scaleMargin()\n }],\n /**\n * Margin Bottom\n * @see https://tailwindcss.com/docs/margin\n */\n mb: [{\n mb: scaleMargin()\n }],\n /**\n * Margin Left\n * @see https://tailwindcss.com/docs/margin\n */\n ml: [{\n ml: scaleMargin()\n }],\n /**\n * Space Between X\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-x': [{\n 'space-x': scaleUnambiguousSpacing()\n }],\n /**\n * Space Between X Reverse\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-x-reverse': ['space-x-reverse'],\n /**\n * Space Between Y\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-y': [{\n 'space-y': scaleUnambiguousSpacing()\n }],\n /**\n * Space Between Y Reverse\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-y-reverse': ['space-y-reverse'],\n // --------------\n // --- Sizing ---\n // --------------\n /**\n * Size\n * @see https://tailwindcss.com/docs/width#setting-both-width-and-height\n */\n size: [{\n size: scaleSizing()\n }],\n /**\n * Inline Size\n * @see https://tailwindcss.com/docs/width\n */\n 'inline-size': [{\n inline: ['auto', ...scaleSizingInline()]\n }],\n /**\n * Min-Inline Size\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-inline-size': [{\n 'min-inline': ['auto', ...scaleSizingInline()]\n }],\n /**\n * Max-Inline Size\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-inline-size': [{\n 'max-inline': ['none', ...scaleSizingInline()]\n }],\n /**\n * Block Size\n * @see https://tailwindcss.com/docs/height\n */\n 'block-size': [{\n block: ['auto', ...scaleSizingBlock()]\n }],\n /**\n * Min-Block Size\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-block-size': [{\n 'min-block': ['auto', ...scaleSizingBlock()]\n }],\n /**\n * Max-Block Size\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-block-size': [{\n 'max-block': ['none', ...scaleSizingBlock()]\n }],\n /**\n * Width\n * @see https://tailwindcss.com/docs/width\n */\n w: [{\n w: [themeContainer, 'screen', ...scaleSizing()]\n }],\n /**\n * Min-Width\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-w': [{\n 'min-w': [themeContainer, 'screen', /** Deprecated. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n 'none', ...scaleSizing()]\n }],\n /**\n * Max-Width\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-w': [{\n 'max-w': [themeContainer, 'screen', 'none', /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n 'prose', /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n {\n screen: [themeBreakpoint]\n }, ...scaleSizing()]\n }],\n /**\n * Height\n * @see https://tailwindcss.com/docs/height\n */\n h: [{\n h: ['screen', 'lh', ...scaleSizing()]\n }],\n /**\n * Min-Height\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-h': [{\n 'min-h': ['screen', 'lh', 'none', ...scaleSizing()]\n }],\n /**\n * Max-Height\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-h': [{\n 'max-h': ['screen', 'lh', ...scaleSizing()]\n }],\n // ------------------\n // --- Typography ---\n // ------------------\n /**\n * Font Size\n * @see https://tailwindcss.com/docs/font-size\n */\n 'font-size': [{\n text: ['base', themeText, isArbitraryVariableLength, isArbitraryLength]\n }],\n /**\n * Font Smoothing\n * @see https://tailwindcss.com/docs/font-smoothing\n */\n 'font-smoothing': ['antialiased', 'subpixel-antialiased'],\n /**\n * Font Style\n * @see https://tailwindcss.com/docs/font-style\n */\n 'font-style': ['italic', 'not-italic'],\n /**\n * Font Weight\n * @see https://tailwindcss.com/docs/font-weight\n */\n 'font-weight': [{\n font: [themeFontWeight, isArbitraryVariableWeight, isArbitraryWeight]\n }],\n /**\n * Font Stretch\n * @see https://tailwindcss.com/docs/font-stretch\n */\n 'font-stretch': [{\n 'font-stretch': ['ultra-condensed', 'extra-condensed', 'condensed', 'semi-condensed', 'normal', 'semi-expanded', 'expanded', 'extra-expanded', 'ultra-expanded', isPercent, isArbitraryValue]\n }],\n /**\n * Font Family\n * @see https://tailwindcss.com/docs/font-family\n */\n 'font-family': [{\n font: [isArbitraryVariableFamilyName, isArbitraryFamilyName, themeFont]\n }],\n /**\n * Font Feature Settings\n * @see https://tailwindcss.com/docs/font-feature-settings\n */\n 'font-features': [{\n 'font-features': [isArbitraryValue]\n }],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-normal': ['normal-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-ordinal': ['ordinal'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-slashed-zero': ['slashed-zero'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-figure': ['lining-nums', 'oldstyle-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-spacing': ['proportional-nums', 'tabular-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-fraction': ['diagonal-fractions', 'stacked-fractions'],\n /**\n * Letter Spacing\n * @see https://tailwindcss.com/docs/letter-spacing\n */\n tracking: [{\n tracking: [themeTracking, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Line Clamp\n * @see https://tailwindcss.com/docs/line-clamp\n */\n 'line-clamp': [{\n 'line-clamp': [isNumber, 'none', isArbitraryVariable, isArbitraryNumber]\n }],\n /**\n * Line Height\n * @see https://tailwindcss.com/docs/line-height\n */\n leading: [{\n leading: [/** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n themeLeading, ...scaleUnambiguousSpacing()]\n }],\n /**\n * List Style Image\n * @see https://tailwindcss.com/docs/list-style-image\n */\n 'list-image': [{\n 'list-image': ['none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * List Style Position\n * @see https://tailwindcss.com/docs/list-style-position\n */\n 'list-style-position': [{\n list: ['inside', 'outside']\n }],\n /**\n * List Style Type\n * @see https://tailwindcss.com/docs/list-style-type\n */\n 'list-style-type': [{\n list: ['disc', 'decimal', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Text Alignment\n * @see https://tailwindcss.com/docs/text-align\n */\n 'text-alignment': [{\n text: ['left', 'center', 'right', 'justify', 'start', 'end']\n }],\n /**\n * Placeholder Color\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://v3.tailwindcss.com/docs/placeholder-color\n */\n 'placeholder-color': [{\n placeholder: scaleColor()\n }],\n /**\n * Text Color\n * @see https://tailwindcss.com/docs/text-color\n */\n 'text-color': [{\n text: scaleColor()\n }],\n /**\n * Text Decoration\n * @see https://tailwindcss.com/docs/text-decoration\n */\n 'text-decoration': ['underline', 'overline', 'line-through', 'no-underline'],\n /**\n * Text Decoration Style\n * @see https://tailwindcss.com/docs/text-decoration-style\n */\n 'text-decoration-style': [{\n decoration: [...scaleLineStyle(), 'wavy']\n }],\n /**\n * Text Decoration Thickness\n * @see https://tailwindcss.com/docs/text-decoration-thickness\n */\n 'text-decoration-thickness': [{\n decoration: [isNumber, 'from-font', 'auto', isArbitraryVariable, isArbitraryLength]\n }],\n /**\n * Text Decoration Color\n * @see https://tailwindcss.com/docs/text-decoration-color\n */\n 'text-decoration-color': [{\n decoration: scaleColor()\n }],\n /**\n * Text Underline Offset\n * @see https://tailwindcss.com/docs/text-underline-offset\n */\n 'underline-offset': [{\n 'underline-offset': [isNumber, 'auto', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Text Transform\n * @see https://tailwindcss.com/docs/text-transform\n */\n 'text-transform': ['uppercase', 'lowercase', 'capitalize', 'normal-case'],\n /**\n * Text Overflow\n * @see https://tailwindcss.com/docs/text-overflow\n */\n 'text-overflow': ['truncate', 'text-ellipsis', 'text-clip'],\n /**\n * Text Wrap\n * @see https://tailwindcss.com/docs/text-wrap\n */\n 'text-wrap': [{\n text: ['wrap', 'nowrap', 'balance', 'pretty']\n }],\n /**\n * Text Indent\n * @see https://tailwindcss.com/docs/text-indent\n */\n indent: [{\n indent: scaleUnambiguousSpacing()\n }],\n /**\n * Tab Size\n * @see https://tailwindcss.com/docs/tab-size\n */\n 'tab-size': [{\n tab: [isInteger, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Vertical Alignment\n * @see https://tailwindcss.com/docs/vertical-align\n */\n 'vertical-align': [{\n align: ['baseline', 'top', 'middle', 'bottom', 'text-top', 'text-bottom', 'sub', 'super', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Whitespace\n * @see https://tailwindcss.com/docs/whitespace\n */\n whitespace: [{\n whitespace: ['normal', 'nowrap', 'pre', 'pre-line', 'pre-wrap', 'break-spaces']\n }],\n /**\n * Word Break\n * @see https://tailwindcss.com/docs/word-break\n */\n break: [{\n break: ['normal', 'words', 'all', 'keep']\n }],\n /**\n * Overflow Wrap\n * @see https://tailwindcss.com/docs/overflow-wrap\n */\n wrap: [{\n wrap: ['break-word', 'anywhere', 'normal']\n }],\n /**\n * Hyphens\n * @see https://tailwindcss.com/docs/hyphens\n */\n hyphens: [{\n hyphens: ['none', 'manual', 'auto']\n }],\n /**\n * Content\n * @see https://tailwindcss.com/docs/content\n */\n content: [{\n content: ['none', isArbitraryVariable, isArbitraryValue]\n }],\n // -------------------\n // --- Backgrounds ---\n // -------------------\n /**\n * Background Attachment\n * @see https://tailwindcss.com/docs/background-attachment\n */\n 'bg-attachment': [{\n bg: ['fixed', 'local', 'scroll']\n }],\n /**\n * Background Clip\n * @see https://tailwindcss.com/docs/background-clip\n */\n 'bg-clip': [{\n 'bg-clip': ['border', 'padding', 'content', 'text']\n }],\n /**\n * Background Origin\n * @see https://tailwindcss.com/docs/background-origin\n */\n 'bg-origin': [{\n 'bg-origin': ['border', 'padding', 'content']\n }],\n /**\n * Background Position\n * @see https://tailwindcss.com/docs/background-position\n */\n 'bg-position': [{\n bg: scaleBgPosition()\n }],\n /**\n * Background Repeat\n * @see https://tailwindcss.com/docs/background-repeat\n */\n 'bg-repeat': [{\n bg: scaleBgRepeat()\n }],\n /**\n * Background Size\n * @see https://tailwindcss.com/docs/background-size\n */\n 'bg-size': [{\n bg: scaleBgSize()\n }],\n /**\n * Background Image\n * @see https://tailwindcss.com/docs/background-image\n */\n 'bg-image': [{\n bg: ['none', {\n linear: [{\n to: ['t', 'tr', 'r', 'br', 'b', 'bl', 'l', 'tl']\n }, isInteger, isArbitraryVariable, isArbitraryValue],\n radial: ['', isArbitraryVariable, isArbitraryValue],\n conic: [isInteger, isArbitraryVariable, isArbitraryValue]\n }, isArbitraryVariableImage, isArbitraryImage]\n }],\n /**\n * Background Color\n * @see https://tailwindcss.com/docs/background-color\n */\n 'bg-color': [{\n bg: scaleColor()\n }],\n /**\n * Gradient Color Stops From Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from-pos': [{\n from: scaleGradientStopPosition()\n }],\n /**\n * Gradient Color Stops Via Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via-pos': [{\n via: scaleGradientStopPosition()\n }],\n /**\n * Gradient Color Stops To Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to-pos': [{\n to: scaleGradientStopPosition()\n }],\n /**\n * Gradient Color Stops From\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from': [{\n from: scaleColor()\n }],\n /**\n * Gradient Color Stops Via\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via': [{\n via: scaleColor()\n }],\n /**\n * Gradient Color Stops To\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to': [{\n to: scaleColor()\n }],\n // ---------------\n // --- Borders ---\n // ---------------\n /**\n * Border Radius\n * @see https://tailwindcss.com/docs/border-radius\n */\n rounded: [{\n rounded: scaleRadius()\n }],\n /**\n * Border Radius Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-s': [{\n 'rounded-s': scaleRadius()\n }],\n /**\n * Border Radius End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-e': [{\n 'rounded-e': scaleRadius()\n }],\n /**\n * Border Radius Top\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-t': [{\n 'rounded-t': scaleRadius()\n }],\n /**\n * Border Radius Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-r': [{\n 'rounded-r': scaleRadius()\n }],\n /**\n * Border Radius Bottom\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-b': [{\n 'rounded-b': scaleRadius()\n }],\n /**\n * Border Radius Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-l': [{\n 'rounded-l': scaleRadius()\n }],\n /**\n * Border Radius Start Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ss': [{\n 'rounded-ss': scaleRadius()\n }],\n /**\n * Border Radius Start End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-se': [{\n 'rounded-se': scaleRadius()\n }],\n /**\n * Border Radius End End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ee': [{\n 'rounded-ee': scaleRadius()\n }],\n /**\n * Border Radius End Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-es': [{\n 'rounded-es': scaleRadius()\n }],\n /**\n * Border Radius Top Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tl': [{\n 'rounded-tl': scaleRadius()\n }],\n /**\n * Border Radius Top Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tr': [{\n 'rounded-tr': scaleRadius()\n }],\n /**\n * Border Radius Bottom Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-br': [{\n 'rounded-br': scaleRadius()\n }],\n /**\n * Border Radius Bottom Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-bl': [{\n 'rounded-bl': scaleRadius()\n }],\n /**\n * Border Width\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w': [{\n border: scaleBorderWidth()\n }],\n /**\n * Border Width Inline\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-x': [{\n 'border-x': scaleBorderWidth()\n }],\n /**\n * Border Width Block\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-y': [{\n 'border-y': scaleBorderWidth()\n }],\n /**\n * Border Width Inline Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-s': [{\n 'border-s': scaleBorderWidth()\n }],\n /**\n * Border Width Inline End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-e': [{\n 'border-e': scaleBorderWidth()\n }],\n /**\n * Border Width Block Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-bs': [{\n 'border-bs': scaleBorderWidth()\n }],\n /**\n * Border Width Block End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-be': [{\n 'border-be': scaleBorderWidth()\n }],\n /**\n * Border Width Top\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-t': [{\n 'border-t': scaleBorderWidth()\n }],\n /**\n * Border Width Right\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-r': [{\n 'border-r': scaleBorderWidth()\n }],\n /**\n * Border Width Bottom\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-b': [{\n 'border-b': scaleBorderWidth()\n }],\n /**\n * Border Width Left\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-l': [{\n 'border-l': scaleBorderWidth()\n }],\n /**\n * Divide Width X\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-x': [{\n 'divide-x': scaleBorderWidth()\n }],\n /**\n * Divide Width X Reverse\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-x-reverse': ['divide-x-reverse'],\n /**\n * Divide Width Y\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-y': [{\n 'divide-y': scaleBorderWidth()\n }],\n /**\n * Divide Width Y Reverse\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-y-reverse': ['divide-y-reverse'],\n /**\n * Border Style\n * @see https://tailwindcss.com/docs/border-style\n */\n 'border-style': [{\n border: [...scaleLineStyle(), 'hidden', 'none']\n }],\n /**\n * Divide Style\n * @see https://tailwindcss.com/docs/border-style#setting-the-divider-style\n */\n 'divide-style': [{\n divide: [...scaleLineStyle(), 'hidden', 'none']\n }],\n /**\n * Border Color\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color': [{\n border: scaleColor()\n }],\n /**\n * Border Color Inline\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-x': [{\n 'border-x': scaleColor()\n }],\n /**\n * Border Color Block\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-y': [{\n 'border-y': scaleColor()\n }],\n /**\n * Border Color Inline Start\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-s': [{\n 'border-s': scaleColor()\n }],\n /**\n * Border Color Inline End\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-e': [{\n 'border-e': scaleColor()\n }],\n /**\n * Border Color Block Start\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-bs': [{\n 'border-bs': scaleColor()\n }],\n /**\n * Border Color Block End\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-be': [{\n 'border-be': scaleColor()\n }],\n /**\n * Border Color Top\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-t': [{\n 'border-t': scaleColor()\n }],\n /**\n * Border Color Right\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-r': [{\n 'border-r': scaleColor()\n }],\n /**\n * Border Color Bottom\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-b': [{\n 'border-b': scaleColor()\n }],\n /**\n * Border Color Left\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-l': [{\n 'border-l': scaleColor()\n }],\n /**\n * Divide Color\n * @see https://tailwindcss.com/docs/divide-color\n */\n 'divide-color': [{\n divide: scaleColor()\n }],\n /**\n * Outline Style\n * @see https://tailwindcss.com/docs/outline-style\n */\n 'outline-style': [{\n outline: [...scaleLineStyle(), 'none', 'hidden']\n }],\n /**\n * Outline Offset\n * @see https://tailwindcss.com/docs/outline-offset\n */\n 'outline-offset': [{\n 'outline-offset': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Outline Width\n * @see https://tailwindcss.com/docs/outline-width\n */\n 'outline-w': [{\n outline: ['', isNumber, isArbitraryVariableLength, isArbitraryLength]\n }],\n /**\n * Outline Color\n * @see https://tailwindcss.com/docs/outline-color\n */\n 'outline-color': [{\n outline: scaleColor()\n }],\n // ---------------\n // --- Effects ---\n // ---------------\n /**\n * Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow\n */\n shadow: [{\n shadow: [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', themeShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-shadow-color\n */\n 'shadow-color': [{\n shadow: scaleColor()\n }],\n /**\n * Inset Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-shadow\n */\n 'inset-shadow': [{\n 'inset-shadow': ['none', themeInsetShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Inset Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-shadow-color\n */\n 'inset-shadow-color': [{\n 'inset-shadow': scaleColor()\n }],\n /**\n * Ring Width\n * @see https://tailwindcss.com/docs/box-shadow#adding-a-ring\n */\n 'ring-w': [{\n ring: scaleBorderWidth()\n }],\n /**\n * Ring Width Inset\n * @see https://v3.tailwindcss.com/docs/ring-width#inset-rings\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-w-inset': ['ring-inset'],\n /**\n * Ring Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-ring-color\n */\n 'ring-color': [{\n ring: scaleColor()\n }],\n /**\n * Ring Offset Width\n * @see https://v3.tailwindcss.com/docs/ring-offset-width\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-offset-w': [{\n 'ring-offset': [isNumber, isArbitraryLength]\n }],\n /**\n * Ring Offset Color\n * @see https://v3.tailwindcss.com/docs/ring-offset-color\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-offset-color': [{\n 'ring-offset': scaleColor()\n }],\n /**\n * Inset Ring Width\n * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-ring\n */\n 'inset-ring-w': [{\n 'inset-ring': scaleBorderWidth()\n }],\n /**\n * Inset Ring Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-ring-color\n */\n 'inset-ring-color': [{\n 'inset-ring': scaleColor()\n }],\n /**\n * Text Shadow\n * @see https://tailwindcss.com/docs/text-shadow\n */\n 'text-shadow': [{\n 'text-shadow': ['none', themeTextShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Text Shadow Color\n * @see https://tailwindcss.com/docs/text-shadow#setting-the-shadow-color\n */\n 'text-shadow-color': [{\n 'text-shadow': scaleColor()\n }],\n /**\n * Opacity\n * @see https://tailwindcss.com/docs/opacity\n */\n opacity: [{\n opacity: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Mix Blend Mode\n * @see https://tailwindcss.com/docs/mix-blend-mode\n */\n 'mix-blend': [{\n 'mix-blend': [...scaleBlendMode(), 'plus-darker', 'plus-lighter']\n }],\n /**\n * Background Blend Mode\n * @see https://tailwindcss.com/docs/background-blend-mode\n */\n 'bg-blend': [{\n 'bg-blend': scaleBlendMode()\n }],\n /**\n * Mask Clip\n * @see https://tailwindcss.com/docs/mask-clip\n */\n 'mask-clip': [{\n 'mask-clip': ['border', 'padding', 'content', 'fill', 'stroke', 'view']\n }, 'mask-no-clip'],\n /**\n * Mask Composite\n * @see https://tailwindcss.com/docs/mask-composite\n */\n 'mask-composite': [{\n mask: ['add', 'subtract', 'intersect', 'exclude']\n }],\n /**\n * Mask Image\n * @see https://tailwindcss.com/docs/mask-image\n */\n 'mask-image-linear-pos': [{\n 'mask-linear': [isNumber]\n }],\n 'mask-image-linear-from-pos': [{\n 'mask-linear-from': scaleMaskImagePosition()\n }],\n 'mask-image-linear-to-pos': [{\n 'mask-linear-to': scaleMaskImagePosition()\n }],\n 'mask-image-linear-from-color': [{\n 'mask-linear-from': scaleColor()\n }],\n 'mask-image-linear-to-color': [{\n 'mask-linear-to': scaleColor()\n }],\n 'mask-image-t-from-pos': [{\n 'mask-t-from': scaleMaskImagePosition()\n }],\n 'mask-image-t-to-pos': [{\n 'mask-t-to': scaleMaskImagePosition()\n }],\n 'mask-image-t-from-color': [{\n 'mask-t-from': scaleColor()\n }],\n 'mask-image-t-to-color': [{\n 'mask-t-to': scaleColor()\n }],\n 'mask-image-r-from-pos': [{\n 'mask-r-from': scaleMaskImagePosition()\n }],\n 'mask-image-r-to-pos': [{\n 'mask-r-to': scaleMaskImagePosition()\n }],\n 'mask-image-r-from-color': [{\n 'mask-r-from': scaleColor()\n }],\n 'mask-image-r-to-color': [{\n 'mask-r-to': scaleColor()\n }],\n 'mask-image-b-from-pos': [{\n 'mask-b-from': scaleMaskImagePosition()\n }],\n 'mask-image-b-to-pos': [{\n 'mask-b-to': scaleMaskImagePosition()\n }],\n 'mask-image-b-from-color': [{\n 'mask-b-from': scaleColor()\n }],\n 'mask-image-b-to-color': [{\n 'mask-b-to': scaleColor()\n }],\n 'mask-image-l-from-pos': [{\n 'mask-l-from': scaleMaskImagePosition()\n }],\n 'mask-image-l-to-pos': [{\n 'mask-l-to': scaleMaskImagePosition()\n }],\n 'mask-image-l-from-color': [{\n 'mask-l-from': scaleColor()\n }],\n 'mask-image-l-to-color': [{\n 'mask-l-to': scaleColor()\n }],\n 'mask-image-x-from-pos': [{\n 'mask-x-from': scaleMaskImagePosition()\n }],\n 'mask-image-x-to-pos': [{\n 'mask-x-to': scaleMaskImagePosition()\n }],\n 'mask-image-x-from-color': [{\n 'mask-x-from': scaleColor()\n }],\n 'mask-image-x-to-color': [{\n 'mask-x-to': scaleColor()\n }],\n 'mask-image-y-from-pos': [{\n 'mask-y-from': scaleMaskImagePosition()\n }],\n 'mask-image-y-to-pos': [{\n 'mask-y-to': scaleMaskImagePosition()\n }],\n 'mask-image-y-from-color': [{\n 'mask-y-from': scaleColor()\n }],\n 'mask-image-y-to-color': [{\n 'mask-y-to': scaleColor()\n }],\n 'mask-image-radial': [{\n 'mask-radial': [isArbitraryVariable, isArbitraryValue]\n }],\n 'mask-image-radial-from-pos': [{\n 'mask-radial-from': scaleMaskImagePosition()\n }],\n 'mask-image-radial-to-pos': [{\n 'mask-radial-to': scaleMaskImagePosition()\n }],\n 'mask-image-radial-from-color': [{\n 'mask-radial-from': scaleColor()\n }],\n 'mask-image-radial-to-color': [{\n 'mask-radial-to': scaleColor()\n }],\n 'mask-image-radial-shape': [{\n 'mask-radial': ['circle', 'ellipse']\n }],\n 'mask-image-radial-size': [{\n 'mask-radial': [{\n closest: ['side', 'corner'],\n farthest: ['side', 'corner']\n }]\n }],\n 'mask-image-radial-pos': [{\n 'mask-radial-at': scalePosition()\n }],\n 'mask-image-conic-pos': [{\n 'mask-conic': [isNumber]\n }],\n 'mask-image-conic-from-pos': [{\n 'mask-conic-from': scaleMaskImagePosition()\n }],\n 'mask-image-conic-to-pos': [{\n 'mask-conic-to': scaleMaskImagePosition()\n }],\n 'mask-image-conic-from-color': [{\n 'mask-conic-from': scaleColor()\n }],\n 'mask-image-conic-to-color': [{\n 'mask-conic-to': scaleColor()\n }],\n /**\n * Mask Mode\n * @see https://tailwindcss.com/docs/mask-mode\n */\n 'mask-mode': [{\n mask: ['alpha', 'luminance', 'match']\n }],\n /**\n * Mask Origin\n * @see https://tailwindcss.com/docs/mask-origin\n */\n 'mask-origin': [{\n 'mask-origin': ['border', 'padding', 'content', 'fill', 'stroke', 'view']\n }],\n /**\n * Mask Position\n * @see https://tailwindcss.com/docs/mask-position\n */\n 'mask-position': [{\n mask: scaleBgPosition()\n }],\n /**\n * Mask Repeat\n * @see https://tailwindcss.com/docs/mask-repeat\n */\n 'mask-repeat': [{\n mask: scaleBgRepeat()\n }],\n /**\n * Mask Size\n * @see https://tailwindcss.com/docs/mask-size\n */\n 'mask-size': [{\n mask: scaleBgSize()\n }],\n /**\n * Mask Type\n * @see https://tailwindcss.com/docs/mask-type\n */\n 'mask-type': [{\n 'mask-type': ['alpha', 'luminance']\n }],\n /**\n * Mask Image\n * @see https://tailwindcss.com/docs/mask-image\n */\n 'mask-image': [{\n mask: ['none', isArbitraryVariable, isArbitraryValue]\n }],\n // ---------------\n // --- Filters ---\n // ---------------\n /**\n * Filter\n * @see https://tailwindcss.com/docs/filter\n */\n filter: [{\n filter: [\n // Deprecated since Tailwind CSS v3.0.0\n '', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Blur\n * @see https://tailwindcss.com/docs/blur\n */\n blur: [{\n blur: scaleBlur()\n }],\n /**\n * Brightness\n * @see https://tailwindcss.com/docs/brightness\n */\n brightness: [{\n brightness: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Contrast\n * @see https://tailwindcss.com/docs/contrast\n */\n contrast: [{\n contrast: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Drop Shadow\n * @see https://tailwindcss.com/docs/drop-shadow\n */\n 'drop-shadow': [{\n 'drop-shadow': [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', themeDropShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Drop Shadow Color\n * @see https://tailwindcss.com/docs/filter-drop-shadow#setting-the-shadow-color\n */\n 'drop-shadow-color': [{\n 'drop-shadow': scaleColor()\n }],\n /**\n * Grayscale\n * @see https://tailwindcss.com/docs/grayscale\n */\n grayscale: [{\n grayscale: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Hue Rotate\n * @see https://tailwindcss.com/docs/hue-rotate\n */\n 'hue-rotate': [{\n 'hue-rotate': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Invert\n * @see https://tailwindcss.com/docs/invert\n */\n invert: [{\n invert: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Saturate\n * @see https://tailwindcss.com/docs/saturate\n */\n saturate: [{\n saturate: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Sepia\n * @see https://tailwindcss.com/docs/sepia\n */\n sepia: [{\n sepia: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Filter\n * @see https://tailwindcss.com/docs/backdrop-filter\n */\n 'backdrop-filter': [{\n 'backdrop-filter': [\n // Deprecated since Tailwind CSS v3.0.0\n '', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Blur\n * @see https://tailwindcss.com/docs/backdrop-blur\n */\n 'backdrop-blur': [{\n 'backdrop-blur': scaleBlur()\n }],\n /**\n * Backdrop Brightness\n * @see https://tailwindcss.com/docs/backdrop-brightness\n */\n 'backdrop-brightness': [{\n 'backdrop-brightness': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Contrast\n * @see https://tailwindcss.com/docs/backdrop-contrast\n */\n 'backdrop-contrast': [{\n 'backdrop-contrast': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Grayscale\n * @see https://tailwindcss.com/docs/backdrop-grayscale\n */\n 'backdrop-grayscale': [{\n 'backdrop-grayscale': ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Hue Rotate\n * @see https://tailwindcss.com/docs/backdrop-hue-rotate\n */\n 'backdrop-hue-rotate': [{\n 'backdrop-hue-rotate': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Invert\n * @see https://tailwindcss.com/docs/backdrop-invert\n */\n 'backdrop-invert': [{\n 'backdrop-invert': ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Opacity\n * @see https://tailwindcss.com/docs/backdrop-opacity\n */\n 'backdrop-opacity': [{\n 'backdrop-opacity': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Saturate\n * @see https://tailwindcss.com/docs/backdrop-saturate\n */\n 'backdrop-saturate': [{\n 'backdrop-saturate': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Sepia\n * @see https://tailwindcss.com/docs/backdrop-sepia\n */\n 'backdrop-sepia': [{\n 'backdrop-sepia': ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n // --------------\n // --- Tables ---\n // --------------\n /**\n * Border Collapse\n * @see https://tailwindcss.com/docs/border-collapse\n */\n 'border-collapse': [{\n border: ['collapse', 'separate']\n }],\n /**\n * Border Spacing\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing': [{\n 'border-spacing': scaleUnambiguousSpacing()\n }],\n /**\n * Border Spacing X\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-x': [{\n 'border-spacing-x': scaleUnambiguousSpacing()\n }],\n /**\n * Border Spacing Y\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-y': [{\n 'border-spacing-y': scaleUnambiguousSpacing()\n }],\n /**\n * Table Layout\n * @see https://tailwindcss.com/docs/table-layout\n */\n 'table-layout': [{\n table: ['auto', 'fixed']\n }],\n /**\n * Caption Side\n * @see https://tailwindcss.com/docs/caption-side\n */\n caption: [{\n caption: ['top', 'bottom']\n }],\n // ---------------------------------\n // --- Transitions and Animation ---\n // ---------------------------------\n /**\n * Transition Property\n * @see https://tailwindcss.com/docs/transition-property\n */\n transition: [{\n transition: ['', 'all', 'colors', 'opacity', 'shadow', 'transform', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Transition Behavior\n * @see https://tailwindcss.com/docs/transition-behavior\n */\n 'transition-behavior': [{\n transition: ['normal', 'discrete']\n }],\n /**\n * Transition Duration\n * @see https://tailwindcss.com/docs/transition-duration\n */\n duration: [{\n duration: [isNumber, 'initial', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Transition Timing Function\n * @see https://tailwindcss.com/docs/transition-timing-function\n */\n ease: [{\n ease: ['linear', 'initial', themeEase, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Transition Delay\n * @see https://tailwindcss.com/docs/transition-delay\n */\n delay: [{\n delay: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Animation\n * @see https://tailwindcss.com/docs/animation\n */\n animate: [{\n animate: ['none', themeAnimate, isArbitraryVariable, isArbitraryValue]\n }],\n // ------------------\n // --- Transforms ---\n // ------------------\n /**\n * Backface Visibility\n * @see https://tailwindcss.com/docs/backface-visibility\n */\n backface: [{\n backface: ['hidden', 'visible']\n }],\n /**\n * Perspective\n * @see https://tailwindcss.com/docs/perspective\n */\n perspective: [{\n perspective: [themePerspective, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Perspective Origin\n * @see https://tailwindcss.com/docs/perspective-origin\n */\n 'perspective-origin': [{\n 'perspective-origin': scalePositionWithArbitrary()\n }],\n /**\n * Rotate\n * @see https://tailwindcss.com/docs/rotate\n */\n rotate: [{\n rotate: scaleRotate()\n }],\n /**\n * Rotate X\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-x': [{\n 'rotate-x': scaleRotate()\n }],\n /**\n * Rotate Y\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-y': [{\n 'rotate-y': scaleRotate()\n }],\n /**\n * Rotate Z\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-z': [{\n 'rotate-z': scaleRotate()\n }],\n /**\n * Scale\n * @see https://tailwindcss.com/docs/scale\n */\n scale: [{\n scale: scaleScale()\n }],\n /**\n * Scale X\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-x': [{\n 'scale-x': scaleScale()\n }],\n /**\n * Scale Y\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-y': [{\n 'scale-y': scaleScale()\n }],\n /**\n * Scale Z\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-z': [{\n 'scale-z': scaleScale()\n }],\n /**\n * Scale 3D\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-3d': ['scale-3d'],\n /**\n * Skew\n * @see https://tailwindcss.com/docs/skew\n */\n skew: [{\n skew: scaleSkew()\n }],\n /**\n * Skew X\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-x': [{\n 'skew-x': scaleSkew()\n }],\n /**\n * Skew Y\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-y': [{\n 'skew-y': scaleSkew()\n }],\n /**\n * Transform\n * @see https://tailwindcss.com/docs/transform\n */\n transform: [{\n transform: [isArbitraryVariable, isArbitraryValue, '', 'none', 'gpu', 'cpu']\n }],\n /**\n * Transform Origin\n * @see https://tailwindcss.com/docs/transform-origin\n */\n 'transform-origin': [{\n origin: scalePositionWithArbitrary()\n }],\n /**\n * Transform Style\n * @see https://tailwindcss.com/docs/transform-style\n */\n 'transform-style': [{\n transform: ['3d', 'flat']\n }],\n /**\n * Translate\n * @see https://tailwindcss.com/docs/translate\n */\n translate: [{\n translate: scaleTranslate()\n }],\n /**\n * Translate X\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-x': [{\n 'translate-x': scaleTranslate()\n }],\n /**\n * Translate Y\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-y': [{\n 'translate-y': scaleTranslate()\n }],\n /**\n * Translate Z\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-z': [{\n 'translate-z': scaleTranslate()\n }],\n /**\n * Translate None\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-none': ['translate-none'],\n /**\n * Zoom\n * @see https://tailwindcss.com/docs/zoom\n */\n zoom: [{\n zoom: [isInteger, isArbitraryVariable, isArbitraryValue]\n }],\n // ---------------------\n // --- Interactivity ---\n // ---------------------\n /**\n * Accent Color\n * @see https://tailwindcss.com/docs/accent-color\n */\n accent: [{\n accent: scaleColor()\n }],\n /**\n * Appearance\n * @see https://tailwindcss.com/docs/appearance\n */\n appearance: [{\n appearance: ['none', 'auto']\n }],\n /**\n * Caret Color\n * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities\n */\n 'caret-color': [{\n caret: scaleColor()\n }],\n /**\n * Color Scheme\n * @see https://tailwindcss.com/docs/color-scheme\n */\n 'color-scheme': [{\n scheme: ['normal', 'dark', 'light', 'light-dark', 'only-dark', 'only-light']\n }],\n /**\n * Cursor\n * @see https://tailwindcss.com/docs/cursor\n */\n cursor: [{\n cursor: ['auto', 'default', 'pointer', 'wait', 'text', 'move', 'help', 'not-allowed', 'none', 'context-menu', 'progress', 'cell', 'crosshair', 'vertical-text', 'alias', 'copy', 'no-drop', 'grab', 'grabbing', 'all-scroll', 'col-resize', 'row-resize', 'n-resize', 'e-resize', 's-resize', 'w-resize', 'ne-resize', 'nw-resize', 'se-resize', 'sw-resize', 'ew-resize', 'ns-resize', 'nesw-resize', 'nwse-resize', 'zoom-in', 'zoom-out', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Field Sizing\n * @see https://tailwindcss.com/docs/field-sizing\n */\n 'field-sizing': [{\n 'field-sizing': ['fixed', 'content']\n }],\n /**\n * Pointer Events\n * @see https://tailwindcss.com/docs/pointer-events\n */\n 'pointer-events': [{\n 'pointer-events': ['auto', 'none']\n }],\n /**\n * Resize\n * @see https://tailwindcss.com/docs/resize\n */\n resize: [{\n resize: ['none', '', 'y', 'x']\n }],\n /**\n * Scroll Behavior\n * @see https://tailwindcss.com/docs/scroll-behavior\n */\n 'scroll-behavior': [{\n scroll: ['auto', 'smooth']\n }],\n /**\n * Scrollbar Thumb Color\n * @see https://tailwindcss.com/docs/scrollbar-color\n */\n 'scrollbar-thumb-color': [{\n 'scrollbar-thumb': scaleColor()\n }],\n /**\n * Scrollbar Track Color\n * @see https://tailwindcss.com/docs/scrollbar-color\n */\n 'scrollbar-track-color': [{\n 'scrollbar-track': scaleColor()\n }],\n /**\n * Scrollbar Gutter\n * @see https://tailwindcss.com/docs/scrollbar-gutter\n */\n 'scrollbar-gutter': [{\n 'scrollbar-gutter': ['auto', 'stable', 'both']\n }],\n /**\n * Scrollbar Width\n * @see https://tailwindcss.com/docs/scrollbar-width\n */\n 'scrollbar-w': [{\n scrollbar: ['auto', 'thin', 'none']\n }],\n /**\n * Scroll Margin\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-m': [{\n 'scroll-m': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Inline\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mx': [{\n 'scroll-mx': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Block\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-my': [{\n 'scroll-my': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Inline Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ms': [{\n 'scroll-ms': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Inline End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-me': [{\n 'scroll-me': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Block Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mbs': [{\n 'scroll-mbs': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Block End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mbe': [{\n 'scroll-mbe': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Top\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mt': [{\n 'scroll-mt': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Right\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mr': [{\n 'scroll-mr': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Bottom\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mb': [{\n 'scroll-mb': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Left\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ml': [{\n 'scroll-ml': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-p': [{\n 'scroll-p': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Inline\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-px': [{\n 'scroll-px': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Block\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-py': [{\n 'scroll-py': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Inline Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-ps': [{\n 'scroll-ps': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Inline End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pe': [{\n 'scroll-pe': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Block Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pbs': [{\n 'scroll-pbs': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Block End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pbe': [{\n 'scroll-pbe': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Top\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pt': [{\n 'scroll-pt': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Right\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pr': [{\n 'scroll-pr': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Bottom\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pb': [{\n 'scroll-pb': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Left\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pl': [{\n 'scroll-pl': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Snap Align\n * @see https://tailwindcss.com/docs/scroll-snap-align\n */\n 'snap-align': [{\n snap: ['start', 'end', 'center', 'align-none']\n }],\n /**\n * Scroll Snap Stop\n * @see https://tailwindcss.com/docs/scroll-snap-stop\n */\n 'snap-stop': [{\n snap: ['normal', 'always']\n }],\n /**\n * Scroll Snap Type\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-type': [{\n snap: ['none', 'x', 'y', 'both']\n }],\n /**\n * Scroll Snap Type Strictness\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-strictness': [{\n snap: ['mandatory', 'proximity']\n }],\n /**\n * Touch Action\n * @see https://tailwindcss.com/docs/touch-action\n */\n touch: [{\n touch: ['auto', 'none', 'manipulation']\n }],\n /**\n * Touch Action X\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-x': [{\n 'touch-pan': ['x', 'left', 'right']\n }],\n /**\n * Touch Action Y\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-y': [{\n 'touch-pan': ['y', 'up', 'down']\n }],\n /**\n * Touch Action Pinch Zoom\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-pz': ['touch-pinch-zoom'],\n /**\n * User Select\n * @see https://tailwindcss.com/docs/user-select\n */\n select: [{\n select: ['none', 'text', 'all', 'auto']\n }],\n /**\n * Will Change\n * @see https://tailwindcss.com/docs/will-change\n */\n 'will-change': [{\n 'will-change': ['auto', 'scroll', 'contents', 'transform', isArbitraryVariable, isArbitraryValue]\n }],\n // -----------\n // --- SVG ---\n // -----------\n /**\n * Fill\n * @see https://tailwindcss.com/docs/fill\n */\n fill: [{\n fill: ['none', ...scaleColor()]\n }],\n /**\n * Stroke Width\n * @see https://tailwindcss.com/docs/stroke-width\n */\n 'stroke-w': [{\n stroke: [isNumber, isArbitraryVariableLength, isArbitraryLength, isArbitraryNumber]\n }],\n /**\n * Stroke\n * @see https://tailwindcss.com/docs/stroke\n */\n stroke: [{\n stroke: ['none', ...scaleColor()]\n }],\n // ---------------------\n // --- Accessibility ---\n // ---------------------\n /**\n * Forced Color Adjust\n * @see https://tailwindcss.com/docs/forced-color-adjust\n */\n 'forced-color-adjust': [{\n 'forced-color-adjust': ['auto', 'none']\n }]\n },\n conflictingClassGroups: {\n 'container-named': ['container-type'],\n overflow: ['overflow-x', 'overflow-y'],\n overscroll: ['overscroll-x', 'overscroll-y'],\n inset: ['inset-x', 'inset-y', 'inset-bs', 'inset-be', 'start', 'end', 'top', 'right', 'bottom', 'left'],\n 'inset-x': ['right', 'left'],\n 'inset-y': ['top', 'bottom'],\n flex: ['basis', 'grow', 'shrink'],\n gap: ['gap-x', 'gap-y'],\n p: ['px', 'py', 'ps', 'pe', 'pbs', 'pbe', 'pt', 'pr', 'pb', 'pl'],\n px: ['pr', 'pl'],\n py: ['pt', 'pb'],\n m: ['mx', 'my', 'ms', 'me', 'mbs', 'mbe', 'mt', 'mr', 'mb', 'ml'],\n mx: ['mr', 'ml'],\n my: ['mt', 'mb'],\n size: ['w', 'h'],\n 'font-size': ['leading'],\n 'fvn-normal': ['fvn-ordinal', 'fvn-slashed-zero', 'fvn-figure', 'fvn-spacing', 'fvn-fraction'],\n 'fvn-ordinal': ['fvn-normal'],\n 'fvn-slashed-zero': ['fvn-normal'],\n 'fvn-figure': ['fvn-normal'],\n 'fvn-spacing': ['fvn-normal'],\n 'fvn-fraction': ['fvn-normal'],\n 'line-clamp': ['display', 'overflow'],\n rounded: ['rounded-s', 'rounded-e', 'rounded-t', 'rounded-r', 'rounded-b', 'rounded-l', 'rounded-ss', 'rounded-se', 'rounded-ee', 'rounded-es', 'rounded-tl', 'rounded-tr', 'rounded-br', 'rounded-bl'],\n 'rounded-s': ['rounded-ss', 'rounded-es'],\n 'rounded-e': ['rounded-se', 'rounded-ee'],\n 'rounded-t': ['rounded-tl', 'rounded-tr'],\n 'rounded-r': ['rounded-tr', 'rounded-br'],\n 'rounded-b': ['rounded-br', 'rounded-bl'],\n 'rounded-l': ['rounded-tl', 'rounded-bl'],\n 'border-spacing': ['border-spacing-x', 'border-spacing-y'],\n 'border-w': ['border-w-x', 'border-w-y', 'border-w-s', 'border-w-e', 'border-w-bs', 'border-w-be', 'border-w-t', 'border-w-r', 'border-w-b', 'border-w-l'],\n 'border-w-x': ['border-w-r', 'border-w-l'],\n 'border-w-y': ['border-w-t', 'border-w-b'],\n 'border-color': ['border-color-x', 'border-color-y', 'border-color-s', 'border-color-e', 'border-color-bs', 'border-color-be', 'border-color-t', 'border-color-r', 'border-color-b', 'border-color-l'],\n 'border-color-x': ['border-color-r', 'border-color-l'],\n 'border-color-y': ['border-color-t', 'border-color-b'],\n translate: ['translate-x', 'translate-y', 'translate-none'],\n 'translate-none': ['translate', 'translate-x', 'translate-y', 'translate-z'],\n 'scroll-m': ['scroll-mx', 'scroll-my', 'scroll-ms', 'scroll-me', 'scroll-mbs', 'scroll-mbe', 'scroll-mt', 'scroll-mr', 'scroll-mb', 'scroll-ml'],\n 'scroll-mx': ['scroll-mr', 'scroll-ml'],\n 'scroll-my': ['scroll-mt', 'scroll-mb'],\n 'scroll-p': ['scroll-px', 'scroll-py', 'scroll-ps', 'scroll-pe', 'scroll-pbs', 'scroll-pbe', 'scroll-pt', 'scroll-pr', 'scroll-pb', 'scroll-pl'],\n 'scroll-px': ['scroll-pr', 'scroll-pl'],\n 'scroll-py': ['scroll-pt', 'scroll-pb'],\n touch: ['touch-x', 'touch-y', 'touch-pz'],\n 'touch-x': ['touch'],\n 'touch-y': ['touch'],\n 'touch-pz': ['touch']\n },\n conflictingClassGroupModifiers: {\n 'font-size': ['leading']\n },\n postfixLookupClassGroups: ['container-type'],\n orderSensitiveModifiers: ['*', '**', 'after', 'backdrop', 'before', 'details-content', 'file', 'first-letter', 'first-line', 'marker', 'placeholder', 'selection']\n };\n};\n\n/**\n * @param baseConfig Config where other config will be merged into. This object will be mutated.\n * @param configExtension Partial config to merge into the `baseConfig`.\n */\nconst mergeConfigs = (baseConfig, {\n cacheSize,\n prefix,\n experimentalParseClassName,\n extend = {},\n override = {}\n}) => {\n overrideProperty(baseConfig, 'cacheSize', cacheSize);\n overrideProperty(baseConfig, 'prefix', prefix);\n overrideProperty(baseConfig, 'experimentalParseClassName', experimentalParseClassName);\n overrideConfigProperties(baseConfig.theme, override.theme);\n overrideConfigProperties(baseConfig.classGroups, override.classGroups);\n overrideConfigProperties(baseConfig.conflictingClassGroups, override.conflictingClassGroups);\n overrideConfigProperties(baseConfig.conflictingClassGroupModifiers, override.conflictingClassGroupModifiers);\n overrideProperty(baseConfig, 'postfixLookupClassGroups', override.postfixLookupClassGroups);\n overrideProperty(baseConfig, 'orderSensitiveModifiers', override.orderSensitiveModifiers);\n mergeConfigProperties(baseConfig.theme, extend.theme);\n mergeConfigProperties(baseConfig.classGroups, extend.classGroups);\n mergeConfigProperties(baseConfig.conflictingClassGroups, extend.conflictingClassGroups);\n mergeConfigProperties(baseConfig.conflictingClassGroupModifiers, extend.conflictingClassGroupModifiers);\n mergeArrayProperties(baseConfig, extend, 'postfixLookupClassGroups');\n mergeArrayProperties(baseConfig, extend, 'orderSensitiveModifiers');\n return baseConfig;\n};\nconst overrideProperty = (baseObject, overrideKey, overrideValue) => {\n if (overrideValue !== undefined) {\n baseObject[overrideKey] = overrideValue;\n }\n};\nconst overrideConfigProperties = (baseObject, overrideObject) => {\n if (overrideObject) {\n for (const key in overrideObject) {\n overrideProperty(baseObject, key, overrideObject[key]);\n }\n }\n};\nconst mergeConfigProperties = (baseObject, mergeObject) => {\n if (mergeObject) {\n for (const key in mergeObject) {\n mergeArrayProperties(baseObject, mergeObject, key);\n }\n }\n};\nconst mergeArrayProperties = (baseObject, mergeObject, key) => {\n const mergeValue = mergeObject[key];\n if (mergeValue !== undefined) {\n baseObject[key] = baseObject[key] ? baseObject[key].concat(mergeValue) : mergeValue;\n }\n};\nconst extendTailwindMerge = (configExtension, ...createConfig) => typeof configExtension === 'function' ? createTailwindMerge(getDefaultConfig, configExtension, ...createConfig) : createTailwindMerge(() => mergeConfigs(getDefaultConfig(), configExtension), ...createConfig);\nconst twMerge = /*#__PURE__*/createTailwindMerge(getDefaultConfig);\nexport { createTailwindMerge, extendTailwindMerge, fromTheme, getDefaultConfig, mergeConfigs, twJoin, twMerge, validators };\n//# sourceMappingURL=bundle-mjs.mjs.map\n","import { clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n//#region src/cn.ts\nfunction cn(...inputs) {\n\treturn twMerge(clsx(inputs));\n}\n//#endregion\n//#region src/sizes.ts\nconst SIZES = [\n\t\"xs\",\n\t\"sm\",\n\t\"md\",\n\t\"lg\",\n\t\"xl\"\n];\nconst DEFAULT_SIZE = \"md\";\n/** Tailwind height utility per size. md uses an arbitrary value because 43px isn't on the spacing scale. */\nconst controlHeight = {\n\txs: \"h-7\",\n\tsm: \"h-9\",\n\tmd: \"h-[43px]\",\n\tlg: \"h-[52px]\",\n\txl: \"h-[60px]\"\n};\nconst controlPaddingX = {\n\txs: \"px-2\",\n\tsm: \"px-2.5\",\n\tmd: \"px-3\",\n\tlg: \"px-3.5\",\n\txl: \"px-4\"\n};\nconst controlTextSize = {\n\txs: \"text-xs\",\n\tsm: \"text-sm\",\n\tmd: \"text-sm\",\n\tlg: \"text-base\",\n\txl: \"text-base\"\n};\n/** Pixel values exposed so non-template code (icons, ResizeObserver, etc.) can read the height. */\nconst controlHeightPx = {\n\txs: 28,\n\tsm: 36,\n\tmd: 43,\n\tlg: 52,\n\txl: 60\n};\n//#endregion\nexport { DEFAULT_SIZE, SIZES, cn, controlHeight, controlHeightPx, controlPaddingX, controlTextSize };\n\n//# sourceMappingURL=index.js.map","import type { CSSProperties } from 'vue';\nimport type { CachedShape, ShapeNode, ShapeNodeType } from '../types';\n\nexport interface WalkOptions {\n maxDepth: number;\n /** Hard cap on captured nodes. Default 500. */\n maxNodes?: number;\n /** Min CSS-pixel size (either axis) for an element to be emitted. Default 4. */\n minSize?: number;\n}\n\nconst DEFAULT_MAX_NODES = 500;\nconst DEFAULT_MIN_SIZE = 4;\n\n/* Atomic elements — never recursed into; rendered as a single block. */\nconst LEAF_TAGS = new Set([\n 'IMG',\n 'SVG',\n 'CANVAS',\n 'VIDEO',\n 'INPUT',\n 'TEXTAREA',\n 'SELECT',\n 'BUTTON',\n 'PROGRESS',\n 'METER',\n 'HR',\n]);\n\n/**\n * Walk `root`'s descendants and produce a list of shimmer blocks that mirror its\n * rendered layout. Coordinates are relative to `root`'s top-left so the result can\n * be replayed in any container of the same size.\n *\n * Performance:\n * - `maxNodes` caps the walk so a 5000-row table doesn't lock up the main thread.\n * - `minSize` filters out hairlines (1-2 px paddings, decorative dots) that\n * inflate node count without adding visual signal.\n * - All `getBoundingClientRect` / `getComputedStyle` reads happen in a single\n * top-down pass with no intervening writes, so the browser does one layout\n * up front and serves cached values from then on (no layout thrashing).\n * - Each emitted `ShapeNode` has a frozen pre-computed `style` (and `lineStyles`\n * for multi-line text) so the render path is allocation-free.\n */\nexport function walkDom(root: HTMLElement, options: WalkOptions): CachedShape {\n const maxNodes = options.maxNodes ?? DEFAULT_MAX_NODES;\n const minSize = options.minSize ?? DEFAULT_MIN_SIZE;\n\n const nodes: ShapeNode[] = [];\n const rootRect = root.getBoundingClientRect();\n let truncated = false;\n\n function visit(el: Element, depth: number): void {\n if (nodes.length >= maxNodes) {\n truncated = true;\n return;\n }\n\n const html = el as HTMLElement;\n if (html.dataset?.skeletonIgnore !== undefined) return;\n\n const cs = window.getComputedStyle(el);\n if (cs.display === 'none' || cs.visibility === 'hidden' || cs.opacity === '0') return;\n\n const rect = el.getBoundingClientRect();\n if (rect.width < minSize || rect.height < minSize) return;\n\n const tag = el.tagName.toUpperCase();\n const isLeafTag = LEAF_TAGS.has(tag);\n const hasStop = html.dataset?.skeletonStop !== undefined;\n const childElements: Element[] = [];\n for (let i = 0; i < el.children.length; i++) {\n const c = el.children[i];\n if ((c as HTMLElement).dataset?.skeletonIgnore === undefined) childElements.push(c);\n }\n const hasOwnText = hasDirectTextContent(el);\n const reachedDepth = depth >= options.maxDepth;\n const isLeaf = isLeafTag || hasStop || reachedDepth || childElements.length === 0;\n\n if (isLeaf) {\n const node = elementToShape(tag, cs, rect, rootRect, hasOwnText);\n if (node) nodes.push(node);\n return;\n }\n\n for (let i = 0; i < childElements.length; i++) {\n if (nodes.length >= maxNodes) {\n truncated = true;\n return;\n }\n visit(childElements[i], depth + 1);\n }\n }\n\n for (let i = 0; i < root.children.length; i++) {\n if (nodes.length >= maxNodes) {\n truncated = true;\n break;\n }\n visit(root.children[i], 1);\n }\n\n return Object.freeze({\n nodes: Object.freeze(nodes),\n width: Math.round(rootRect.width),\n height: Math.round(rootRect.height),\n truncated,\n }) as CachedShape;\n}\n\nfunction hasDirectTextContent(el: Element): boolean {\n for (let i = 0; i < el.childNodes.length; i++) {\n const node = el.childNodes[i];\n if (node.nodeType === Node.TEXT_NODE && (node.textContent ?? '').trim().length > 0) {\n return true;\n }\n }\n return false;\n}\n\nfunction elementToShape(\n tag: string,\n cs: CSSStyleDeclaration,\n rect: DOMRect,\n origin: DOMRect,\n hasText: boolean\n): ShapeNode | null {\n const x = Math.round(rect.left - origin.left);\n const y = Math.round(rect.top - origin.top);\n const w = Math.round(rect.width);\n const h = Math.round(rect.height);\n\n const radius = parseFloat(cs.borderRadius) || 0;\n const minDim = Math.min(w, h);\n const isCircle = radius >= minDim / 2 - 1 && Math.abs(w - h) <= 2 && minDim > 0;\n\n let type: ShapeNodeType;\n let resolvedRadius = radius;\n let lines: number | undefined;\n let lineHeight: number | undefined;\n\n if (tag === 'IMG' || tag === 'SVG' || tag === 'VIDEO' || tag === 'CANVAS') {\n type = 'image';\n } else if (isCircle) {\n type = 'circle';\n resolvedRadius = Math.floor(minDim / 2);\n } else if (hasText) {\n type = 'text';\n lineHeight = Math.round(parseFloat(cs.lineHeight) || parseFloat(cs.fontSize) * 1.4 || 16);\n lines = Math.max(1, Math.round(h / lineHeight));\n resolvedRadius = Math.min(radius, 4);\n } else {\n type = 'block';\n }\n\n return freezeShape({\n type,\n x,\n y,\n w,\n h,\n radius: resolvedRadius,\n lines,\n lineHeight,\n });\n}\n\n/**\n * Pre-compute (and freeze) the inline styles used at render time. Doing it once\n * here means rendering 500 blocks doesn't allocate 500 style objects per frame.\n */\nfunction freezeShape(node: {\n type: ShapeNodeType;\n x: number;\n y: number;\n w: number;\n h: number;\n radius: number;\n lines?: number;\n lineHeight?: number;\n}): ShapeNode {\n const style: CSSProperties = Object.freeze({\n left: `${node.x}px`,\n top: `${node.y}px`,\n width: `${node.w}px`,\n height: `${node.h}px`,\n borderRadius: `${node.radius}px`,\n });\n\n let lineStyles: ReadonlyArray<Readonly<CSSProperties>> | undefined;\n if (node.type === 'text' && node.lines && node.lines > 1) {\n const lh = node.lineHeight ?? Math.round(node.h / node.lines);\n const barHeight = Math.max(8, Math.round(lh * 0.7));\n const widthFull = `${node.w}px`;\n const widthLast = `${Math.max(40, Math.round(node.w * 0.7))}px`;\n const heightStr = `${barHeight}px`;\n const radiusStr = `${node.radius}px`;\n const arr: Readonly<CSSProperties>[] = [];\n for (let i = 1; i <= node.lines; i++) {\n const isLast = i === node.lines;\n arr.push(\n Object.freeze<CSSProperties>({\n left: `${node.x}px`,\n top: `${node.y + (i - 1) * lh}px`,\n width: isLast ? widthLast : widthFull,\n height: heightStr,\n borderRadius: radiusStr,\n })\n );\n }\n lineStyles = Object.freeze(arr);\n }\n\n return Object.freeze({\n type: node.type,\n x: node.x,\n y: node.y,\n w: node.w,\n h: node.h,\n radius: node.radius,\n lines: node.lines,\n lineHeight: node.lineHeight,\n style,\n lineStyles,\n });\n}\n","import { onBeforeUnmount, watch } from 'vue';\nimport type { CachedShape } from '../types';\nimport { walkDom } from '../utils/walkDom';\n\nexport interface ShapeProbeOptions {\n maxDepth: number;\n /** Forwarded to `walkDom`. Default 500. */\n maxNodes?: number;\n /** Forwarded to `walkDom`. Default 4. */\n minSize?: number;\n /**\n * Debounce window for `ResizeObserver`-triggered re-captures, in ms.\n * Default 150. Prevents a re-walk every animation frame while the user is\n * actively dragging the viewport edge. The first capture (initial mount) is\n * always immediate via `requestAnimationFrame`.\n */\n resizeDebounceMs?: number;\n onCapture: (shape: CachedShape) => void;\n}\n\nconst DEFAULT_RESIZE_DEBOUNCE_MS = 150;\n\n/**\n * Observe `getTarget()` and capture its rendered shape whenever the element\n * appears or resizes.\n *\n * Performance:\n * - Initial capture runs via `requestAnimationFrame` so it sneaks into the\n * first idle window after mount — no synchronous layout from inside the\n * render queue.\n * - Subsequent `ResizeObserver` callbacks are debounced (default 150 ms) so a\n * drag-resize doesn't trigger a fresh DOM walk per frame.\n * - `walkDom` itself enforces `maxNodes` so even a worst-case capture (10k\n * descendants) returns in bounded time.\n */\nexport function useShapeProbe(getTarget: () => HTMLElement | null, options: ShapeProbeOptions) {\n let observer: ResizeObserver | undefined;\n let frame: number | undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let hasCaptured = false;\n\n const debounceMs = options.resizeDebounceMs ?? DEFAULT_RESIZE_DEBOUNCE_MS;\n\n function cleanup() {\n if (observer) {\n observer.disconnect();\n observer = undefined;\n }\n if (frame !== undefined) {\n cancelAnimationFrame(frame);\n frame = undefined;\n }\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n }\n }\n\n function capture(el: HTMLElement) {\n const result = walkDom(el, {\n maxDepth: options.maxDepth,\n maxNodes: options.maxNodes,\n minSize: options.minSize,\n });\n if (result.width > 0 && result.height > 0 && result.nodes.length > 0) {\n hasCaptured = true;\n options.onCapture(result);\n }\n }\n\n function scheduleImmediate(el: HTMLElement) {\n if (frame !== undefined) cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => {\n frame = undefined;\n capture(el);\n });\n }\n\n function scheduleDebounced(el: HTMLElement) {\n if (timer !== undefined) clearTimeout(timer);\n timer = setTimeout(() => {\n timer = undefined;\n capture(el);\n }, debounceMs);\n }\n\n watch(\n getTarget,\n (el) => {\n cleanup();\n hasCaptured = false;\n if (!el || typeof window === 'undefined') return;\n scheduleImmediate(el);\n if (typeof ResizeObserver !== 'undefined') {\n observer = new ResizeObserver(() => {\n /* ResizeObserver fires once on observe() — let the rAF capture above\n * handle the initial measurement, then debounce everything that\n * follows so a drag-resize doesn't trigger a re-walk per frame. */\n if (hasCaptured) scheduleDebounced(el);\n });\n observer.observe(el);\n }\n },\n { immediate: true, flush: 'post' }\n );\n\n onBeforeUnmount(cleanup);\n}\n","import type { CSSProperties } from 'vue';\nimport type { CachedShape, ShapeNode } from '../types';\n\nconst memory = new Map<string, CachedShape>();\nconst STORAGE_PREFIX = 'a-skeleton:';\n\n/**\n * Schema version for persisted entries. Bump whenever the `ShapeNode` /\n * `CachedShape` field set changes so stale localStorage payloads from older\n * releases get dropped on read instead of rehydrating into a wrong layout.\n */\nconst SCHEMA_VERSION = 1;\n\ninterface PersistedShape {\n v: number;\n width: number;\n height: number;\n nodes: Partial<ShapeNode>[];\n truncated?: boolean;\n}\n\n/**\n * Lookup a captured shape by key. Reads in-memory first, then `localStorage` if\n * `persist` is enabled. SSR-safe — bypasses `window` access on the server.\n * Rehydrates pre-computed styles for shapes deserialized from older sessions\n * (Object.freeze + style/lineStyles don't survive `JSON.stringify` round-trip).\n * Drops the entry if it was written by a different schema version.\n */\nexport function getCached(key: string, persist: boolean): CachedShape | undefined {\n const hit = memory.get(key);\n if (hit) return hit;\n if (!persist || typeof window === 'undefined') return undefined;\n try {\n const storageKey = STORAGE_PREFIX + key;\n const raw = window.localStorage.getItem(storageKey);\n if (!raw) return undefined;\n const parsed = JSON.parse(raw) as Partial<PersistedShape>;\n if (parsed.v !== SCHEMA_VERSION) {\n /* Stale payload from a previous release — purge so the next capture\n * writes a fresh entry instead of rehydrating into a wrong layout. */\n window.localStorage.removeItem(storageKey);\n return undefined;\n }\n const rehydrated = rehydrateShape(parsed as PersistedShape);\n memory.set(key, rehydrated);\n return rehydrated;\n } catch {\n return undefined;\n }\n}\n\n/** Store a captured shape. `persist=true` mirrors to `localStorage`. */\nexport function setCached(key: string, value: CachedShape, persist: boolean): void {\n memory.set(key, value);\n if (!persist || typeof window === 'undefined') return;\n try {\n /* Only the geometry survives the round-trip; styles get rebuilt on read. */\n const lean: PersistedShape = {\n v: SCHEMA_VERSION,\n width: value.width,\n height: value.height,\n nodes: leanNodes(value.nodes),\n truncated: value.truncated,\n };\n window.localStorage.setItem(STORAGE_PREFIX + key, JSON.stringify(lean));\n } catch {\n /* quota exceeded / disabled storage — silently degrade to in-memory only. */\n }\n}\n\n/** Drop a single entry (or all entries when no key). Exposed for tests + manual invalidation. */\nexport function clearCached(key?: string): void {\n if (!key) {\n memory.clear();\n if (typeof window === 'undefined') return;\n try {\n for (const k of Object.keys(window.localStorage)) {\n if (k.startsWith(STORAGE_PREFIX)) window.localStorage.removeItem(k);\n }\n } catch {\n /* ignore */\n }\n return;\n }\n memory.delete(key);\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.removeItem(STORAGE_PREFIX + key);\n } catch {\n /* ignore */\n }\n}\n\n/**\n * Rebuild `style` + `lineStyles` for nodes that lost them via serialization.\n * Walks the array in-place where possible and freezes the result so the render\n * path stays allocation-free.\n */\nfunction rehydrateShape(shape: PersistedShape): CachedShape {\n const nodes = shape.nodes.map((n) => freezeNodeStyles(n as ShapeNode));\n return Object.freeze({\n nodes: Object.freeze(nodes),\n width: shape.width,\n height: shape.height,\n truncated: shape.truncated,\n }) as CachedShape;\n}\n\nfunction leanNodes(nodes: ReadonlyArray<ShapeNode>): Partial<ShapeNode>[] {\n /* Strip the (re-derivable) style fields before persisting so the localStorage\n * payload stays small — a 500-node shape would otherwise serialize ~500 frozen\n * style objects redundantly. */\n return nodes.map((n) => ({\n type: n.type,\n x: n.x,\n y: n.y,\n w: n.w,\n h: n.h,\n radius: n.radius,\n lines: n.lines,\n lineHeight: n.lineHeight,\n }));\n}\n\nfunction freezeNodeStyles(node: ShapeNode): ShapeNode {\n const style: CSSProperties = Object.freeze({\n left: `${node.x}px`,\n top: `${node.y}px`,\n width: `${node.w}px`,\n height: `${node.h}px`,\n borderRadius: `${node.radius}px`,\n });\n\n let lineStyles: ReadonlyArray<Readonly<CSSProperties>> | undefined;\n if (node.type === 'text' && node.lines && node.lines > 1) {\n const lh = node.lineHeight ?? Math.round(node.h / node.lines);\n const barHeight = Math.max(8, Math.round(lh * 0.7));\n const widthFull = `${node.w}px`;\n const widthLast = `${Math.max(40, Math.round(node.w * 0.7))}px`;\n const heightStr = `${barHeight}px`;\n const radiusStr = `${node.radius}px`;\n const arr: Readonly<CSSProperties>[] = [];\n for (let i = 1; i <= node.lines; i++) {\n const isLast = i === node.lines;\n arr.push(\n Object.freeze<CSSProperties>({\n left: `${node.x}px`,\n top: `${node.y + (i - 1) * lh}px`,\n width: isLast ? widthLast : widthFull,\n height: heightStr,\n borderRadius: radiusStr,\n })\n );\n }\n lineStyles = Object.freeze(arr);\n }\n\n return Object.freeze({\n type: node.type,\n x: node.x,\n y: node.y,\n w: node.w,\n h: node.h,\n radius: node.radius,\n lines: node.lines,\n lineHeight: node.lineHeight,\n style,\n lineStyles,\n });\n}\n","import { Comment, Fragment, Text, type VNode } from 'vue';\n\n/**\n * Derive a default cache key from a slot's vnode tree. Returns the first\n * non-comment child's component name (or HTML tag). When the slot only contains\n * text / comments / unknown content, returns `'anonymous'` so the caller can\n * still cache, but with no useful identity — encourage an explicit `cacheKey`.\n */\nexport function fingerprintSlot(vnodes: VNode[] | undefined): string {\n if (!vnodes) return 'anonymous';\n for (const vnode of vnodes) {\n const tag = describeVNode(vnode);\n if (tag) return tag;\n }\n return 'anonymous';\n}\n\nfunction describeVNode(vnode: VNode): string | undefined {\n const t = vnode.type;\n if (t === Comment || t === Text) return undefined;\n if (t === Fragment) {\n const children = vnode.children;\n if (Array.isArray(children)) {\n for (const child of children) {\n if (child && typeof child === 'object' && 'type' in (child as object)) {\n const found = describeVNode(child as VNode);\n if (found) return found;\n }\n }\n }\n return undefined;\n }\n if (typeof t === 'string') return t;\n if (typeof t === 'object' && t !== null) {\n const named =\n (t as { name?: string }).name ??\n (t as { __name?: string }).__name ??\n (t as { displayName?: string }).displayName;\n if (named) return named;\n }\n return undefined;\n}\n","import {\n Comment,\n Fragment,\n Text,\n h,\n type VNode,\n type VNodeArrayChildren,\n type VNodeChild,\n} from 'vue';\n\n/**\n * Atomic HTML tags — rendered as a single skeleton block. Their own class/style\n * is preserved so Tailwind utilities (`size-16`, `rounded-full`, …) carry the\n * dimensions across without us needing to measure.\n */\nconst ATOMIC_TAGS = new Set([\n 'img',\n 'svg',\n 'canvas',\n 'video',\n 'input',\n 'textarea',\n 'select',\n 'button',\n 'progress',\n 'meter',\n 'hr',\n]);\n\n/** Single-line text containers — produce one bar. */\nconst HEADING_TAGS = new Set(['h1', 'h2', 'h3', 'h4', 'h5', 'h6']);\n\n/** Multi-line text containers — produce N bars with a shortened last line. */\nconst PARAGRAPH_TAGS = new Set(['p', 'blockquote']);\n\n/** Inline text — single bar, but inherits parent font sizing. */\nconst INLINE_TEXT_TAGS = new Set([\n 'span',\n 'a',\n 'small',\n 'strong',\n 'em',\n 'code',\n 'time',\n 'label',\n 'b',\n 'i',\n 'mark',\n]);\n\nexport interface BuildOptions {\n animationClass: string | null;\n /** Max recursion depth — guards runaway templates. Default 8. */\n maxDepth?: number;\n /**\n * Hard cap on emitted skeleton nodes. Default 300. A 200-row table doesn't\n * need 200 distinct skeleton rows on first paint; cap and stop early.\n */\n maxNodes?: number;\n}\n\nconst DEFAULT_MAX_DEPTH = 8;\nconst DEFAULT_MAX_NODES = 300;\n\ninterface WalkState {\n emitted: number;\n cap: number;\n}\n\n/**\n * Walk a slot's vnode tree and produce a skeleton that mirrors its rendered\n * structure: same wrapping tags, same `class` strings (so flex/grid/spacing/\n * sizing utilities still apply), but text/atomic leaves replaced with shimmer\n * blocks. The result renders correctly on the FIRST paint without any DOM\n * measurement, as long as the slot's template renders structure even when its\n * data is empty (use `v-if`/`v-else` to swap content, not to gate the wrapper).\n *\n * Performance: `maxNodes` caps the work. When the cap is hit we stop emitting\n * — the caller still gets a valid skeleton, just clipped at the budget. A 1000-\n * row list renders ~300 skeleton rows on first paint and then the measured cache\n * takes over for subsequent loads.\n */\nexport function buildStructuralSkeleton(\n vnodes: VNodeChild | VNodeArrayChildren | undefined | null,\n opts: BuildOptions\n): VNode[] {\n const maxDepth = opts.maxDepth ?? DEFAULT_MAX_DEPTH;\n const state: WalkState = { emitted: 0, cap: opts.maxNodes ?? DEFAULT_MAX_NODES };\n const out: VNode[] = [];\n walk(vnodes, opts, 0, maxDepth, state, out);\n return out;\n}\n\nfunction walk(\n input: VNodeChild | VNodeArrayChildren | undefined | null,\n opts: BuildOptions,\n depth: number,\n max: number,\n state: WalkState,\n out: VNode[]\n): void {\n if (state.emitted >= state.cap) return;\n if (input == null || typeof input === 'boolean') return;\n\n if (Array.isArray(input)) {\n for (let i = 0; i < input.length; i++) {\n if (state.emitted >= state.cap) return;\n walk(input[i] as VNodeChild, opts, depth, max, state, out);\n }\n return;\n }\n\n if (typeof input === 'string' || typeof input === 'number') {\n const str = String(input).trim();\n if (str) push(out, textBar(opts.animationClass), state);\n return;\n }\n\n const v = input as VNode;\n const type = v.type;\n\n if (type === Comment) return;\n\n if (type === Text) {\n const t = typeof v.children === 'string' ? v.children.trim() : '';\n if (t) push(out, textBar(opts.animationClass), state);\n return;\n }\n\n if (type === Fragment) {\n walk(v.children as VNodeArrayChildren, opts, depth, max, state, out);\n return;\n }\n\n if (typeof type === 'string') {\n push(out, transformElement(v, type.toLowerCase(), opts, depth, max, state), state);\n return;\n }\n\n /* Component vnode — we can't introspect its template, so render an opaque\n * skeleton block carrying any utility classes the user attached to it. */\n if (typeof type === 'object' || typeof type === 'function') {\n push(\n out,\n h('div', {\n class: ['a-skel-block', v.props?.class, opts.animationClass],\n style: v.props?.style as Record<string, string>,\n }),\n state\n );\n }\n}\n\nfunction push(out: VNode[], vn: VNode, state: WalkState): void {\n if (state.emitted >= state.cap) return;\n out.push(vn);\n state.emitted++;\n}\n\nfunction transformElement(\n v: VNode,\n tag: string,\n opts: BuildOptions,\n depth: number,\n max: number,\n state: WalkState\n): VNode {\n const cls = v.props?.class;\n const styl = v.props?.style as Record<string, string> | string | undefined;\n\n if (ATOMIC_TAGS.has(tag)) {\n return h('div', { class: ['a-skel-block', cls, opts.animationClass], style: styl });\n }\n\n if (HEADING_TAGS.has(tag)) {\n return h(tag, { class: cls, style: styl }, [textBar(opts.animationClass)]);\n }\n\n if (PARAGRAPH_TAGS.has(tag)) {\n const children = v.children;\n const recursedChildren: VNode[] = [];\n walk(children as VNodeArrayChildren, opts, depth + 1, max, state, recursedChildren);\n if (recursedChildren.length > 0) return h(tag, { class: cls, style: styl }, recursedChildren);\n const lines = estimateLines(children, 3);\n return h(tag, { class: cls, style: styl }, multiLineBars(lines, opts.animationClass));\n }\n\n if (INLINE_TEXT_TAGS.has(tag)) {\n const children = v.children;\n const recursedChildren: VNode[] = [];\n walk(children as VNodeArrayChildren, opts, depth + 1, max, state, recursedChildren);\n if (recursedChildren.length > 0) return h(tag, { class: cls, style: styl }, recursedChildren);\n return h(tag, { class: cls, style: styl }, [textBar(opts.animationClass)]);\n }\n\n /* Generic container — keep its classes (flex/grid/padding/etc.) and recurse. */\n if (depth >= max) {\n return h('div', { class: ['a-skel-block', cls, opts.animationClass], style: styl });\n }\n const recursed: VNode[] = [];\n walk(v.children as VNodeArrayChildren, opts, depth + 1, max, state, recursed);\n if (recursed.length === 0) {\n /* Empty container in the source — render as a single block so the layout\n * still reserves space rather than collapsing to zero height. */\n return h('div', { class: ['a-skel-block', cls, opts.animationClass], style: styl });\n }\n return h(tag, { class: cls, style: styl }, recursed);\n}\n\nfunction estimateLines(children: unknown, max: number): number {\n if (typeof children !== 'string') return 1;\n const len = children.trim().length;\n if (len === 0)\n return 2; /* empty interpolation — assume 2 lines so the bar looks paragraph-shaped */\n if (len < 40) return 1;\n if (len < 100) return 2;\n return Math.min(max, 3);\n}\n\nfunction multiLineBars(lines: number, animationClass: string | null): VNode[] {\n const out: VNode[] = [];\n for (let i = 0; i < lines; i++) {\n out.push(textBar(animationClass, i === lines - 1 && lines > 1 ? 0.65 : 1));\n }\n return out;\n}\n\n/* Style objects for the two common bar shapes are reused across calls so a\n * structural skeleton with 200 text bars doesn't allocate 200 style objects. */\nconst BAR_STYLE_FULL = Object.freeze({\n display: 'inline-block',\n width: '100%',\n height: '0.75em',\n verticalAlign: 'middle',\n borderRadius: '4px',\n});\n\nconst PARTIAL_BAR_CACHE = new Map<number, Readonly<Record<string, string>>>();\n\nfunction partialBarStyle(widthFraction: number): Readonly<Record<string, string>> {\n /* Round to one decimal so 0.65, 0.7, 0.85 each get a single cached style. */\n const key = Math.round(widthFraction * 10) / 10;\n const hit = PARTIAL_BAR_CACHE.get(key);\n if (hit) return hit;\n const made = Object.freeze({\n display: 'inline-block',\n width: `${Math.round(key * 100)}%`,\n height: '0.75em',\n verticalAlign: 'middle',\n borderRadius: '4px',\n });\n PARTIAL_BAR_CACHE.set(key, made);\n return made;\n}\n\nfunction textBar(animationClass: string | null, widthFraction = 1): VNode {\n return h('span', {\n class: ['a-skel-block', 'a-skel-block--text', animationClass],\n style: widthFraction === 1 ? BAR_STYLE_FULL : partialBarStyle(widthFraction),\n });\n}\n","import { defineComponent, type PropType, type VNode, type VNodeArrayChildren } from 'vue';\nimport { buildStructuralSkeleton } from '../utils/buildStructuralSkeleton';\n\n/**\n * Renders a structural skeleton derived from a slot's vnode tree. Pure render\n * function — no template, no scoped styles — so the parent's class strings\n * pass through unchanged and Tailwind utilities continue to drive layout.\n *\n * `maxNodes` is forwarded to the walker; cap defaults to 300 (see\n * `buildStructuralSkeleton`). Beyond that the walk stops emitting and the cap\n * propagates back as a clipped tree, keeping first-paint bounded.\n */\nexport const StructuralSkeleton = defineComponent({\n name: 'StructuralSkeleton',\n props: {\n vnodes: {\n type: Array as unknown as PropType<VNodeArrayChildren>,\n required: true,\n },\n animation: {\n type: String as PropType<string | null>,\n default: null,\n },\n maxDepth: {\n type: Number,\n default: 8,\n },\n maxNodes: {\n type: Number,\n default: 300,\n },\n },\n setup(props) {\n return (): VNode[] =>\n buildStructuralSkeleton(props.vnodes, {\n animationClass: props.animation,\n maxDepth: props.maxDepth,\n maxNodes: props.maxNodes,\n });\n },\n});\n","<script setup lang=\"ts\">\nimport { computed, ref, shallowRef, useId, useSlots, watch, type CSSProperties } from 'vue';\nimport { cn } from '@alikhalilll/a-ui-base';\nimport type { ASkeletonProps, ASkeletonSlots, CachedShape, ShapeNodeType } from '../types';\nimport { useShapeProbe } from '../composables/useShapeProbe';\nimport { getCached, setCached } from '../composables/useSkeletonCache';\nimport { fingerprintSlot } from '../utils/fingerprint';\nimport { StructuralSkeleton } from './StructuralSkeleton';\n\nconst props = withDefaults(defineProps<ASkeletonProps>(), {\n maxDepth: 6,\n maxNodes: 500,\n minNodeSize: 4,\n persist: false,\n animation: 'shimmer',\n fallback: 'shimmer',\n});\ndefineSlots<ASkeletonSlots>();\n\nconst slots = useSlots();\n\n/* Per-instance suffix from Vue's useId() — deterministic across SSR/hydration\n * and stable across re-renders, but distinct per <ASkeleton> instance. Two\n * <ASkeleton><UserCard/></ASkeleton> on the same page therefore never collide\n * on the auto-generated key. Pass an explicit `cacheKey` to share a shape\n * across instances on purpose. */\nconst instanceId = useId();\n\nconst resolvedKey = computed(\n () => props.cacheKey ?? `${fingerprintSlot(slots.default?.())}:${instanceId}`\n);\n\nconst warnedKeys = new Set<string>();\n\nconst cached = shallowRef<CachedShape | undefined>(getCached(resolvedKey.value, props.persist));\n\nwatch(resolvedKey, (key) => {\n cached.value = getCached(key, props.persist);\n});\n\nconst wrapperRef = ref<HTMLElement | null>(null);\n\n/* Probe runs whenever the real content is mounted (loading=false). The getter\n * returns null during loading so the watch tears down its ResizeObserver. */\nuseShapeProbe(() => (props.loading ? null : wrapperRef.value), {\n maxDepth: props.maxDepth,\n maxNodes: props.maxNodes,\n minSize: props.minNodeSize,\n onCapture: (shape) => {\n setCached(resolvedKey.value, shape, props.persist);\n cached.value = shape;\n if (shape.truncated && !warnedKeys.has(resolvedKey.value)) {\n warnedKeys.add(resolvedKey.value);\n console.warn(\n `[ASkeleton] Capture truncated at maxNodes=${props.maxNodes} for cacheKey=\"${resolvedKey.value}\". ` +\n `The replayed skeleton will be missing nodes. Raise \\`max-nodes\\` or mark dense subtrees with ` +\n `\\`data-skeleton-stop\\` to collapse them into a single block.`\n );\n }\n },\n});\n\nconst animationClass = computed(() =>\n props.animation === 'none' ? null : `a-skel-block--anim-${props.animation}`\n);\n\nconst layerStyle = computed<CSSProperties>(() =>\n cached.value ? { width: `${cached.value.width}px`, height: `${cached.value.height}px` } : {}\n);\n\n/* Pre-join the per-type class strings once per animation value so the render\n * loop doesn't allocate a new `[a, b, c]` array per node per frame — meaningful\n * when a cache holds hundreds of nodes. */\nconst blockClassByType = computed<Readonly<Record<ShapeNodeType, string>>>(() => {\n const anim = animationClass.value;\n const suffix = anim ? ` ${anim}` : '';\n return Object.freeze({\n block: `a-skel-block a-skel-block--block${suffix}`,\n text: `a-skel-block a-skel-block--text${suffix}`,\n image: `a-skel-block a-skel-block--image${suffix}`,\n circle: `a-skel-block a-skel-block--circle${suffix}`,\n });\n});\n\n/* Cache-miss fallback path: walk the slot's vnodes synchronously so the FIRST\n * paint already shows a skeleton that mirrors the component's HTML structure\n * (same tags, classes, hierarchy → same flex/grid/spacing/sizing utilities\n * still apply). If the slot is empty / only renders comments (e.g. the user\n * gates the whole template on `v-if=\"data\"`), we get an empty array back and\n * fall through to the generic shimmer block. */\nconst structuralVNodes = computed(() => (props.loading ? (slots.default?.() ?? []) : []));\nconst hasStructure = computed(() => structuralVNodes.value.length > 0);\n</script>\n\n<template>\n <div\n ref=\"wrapperRef\"\n :class=\"cn('a-skeleton', props.class)\"\n :data-loading=\"props.loading ? '' : undefined\"\n >\n <template v-if=\"props.loading\">\n <!-- 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. -->\n <div\n v-if=\"cached\"\n class=\"a-skeleton__layer\"\n :style=\"layerStyle\"\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n >\n <template v-for=\"(node, idx) in cached.nodes\" :key=\"idx\">\n <template v-if=\"node.lineStyles\">\n <div\n v-for=\"(lineStyle, i) in node.lineStyles\"\n :key=\"`${idx}-${i}`\"\n :class=\"blockClassByType.text\"\n :style=\"lineStyle\"\n />\n </template>\n <div v-else :class=\"blockClassByType[node.type]\" :style=\"node.style\" />\n </template>\n </div>\n\n <!-- Cache miss + slot has structure: render a structural skeleton derived\n from the slot's vnode tree. First paint already looks right. -->\n <div\n v-else-if=\"hasStructure\"\n class=\"a-skeleton__structural\"\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n >\n <StructuralSkeleton\n :vnodes=\"structuralVNodes\"\n :animation=\"animationClass\"\n :max-depth=\"maxDepth\"\n :max-nodes=\"maxNodes\"\n />\n </div>\n\n <!-- Cache miss + nothing to walk: generic shimmer. -->\n <div v-else class=\"a-skeleton__fallback\" role=\"status\" aria-busy=\"true\">\n <slot name=\"fallback\">\n <div\n class=\"a-skel-block a-skel-block--block a-skel-fallback-default\"\n :class=\"animationClass\"\n />\n </slot>\n </div>\n </template>\n\n <slot v-else />\n </div>\n</template>\n\n<style scoped>\n.a-skeleton {\n display: block;\n position: relative;\n}\n\n/* `.a-skeleton__layer` + `.a-skeleton__layer > .a-skel-block` layout/containment\n * live in `styles.src.css` so they're shared with the public `<ASkeletonLayer>`\n * component. */\n\n.a-skeleton__structural :deep(*) {\n /* Disable text caret/selection on the structural copy so it doesn't look\n * interactive. Layout (flex/grid/spacing/sizing) flows through unchanged. */\n user-select: none;\n pointer-events: none;\n}\n\n.a-skeleton__structural :deep(button),\n.a-skeleton__structural :deep(input),\n.a-skeleton__structural :deep(a) {\n cursor: default;\n}\n\n.a-skeleton__fallback :deep(.a-skel-fallback-default) {\n width: 100%;\n height: 4rem;\n border-radius: 0.5rem;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, type CSSProperties } from 'vue';\nimport { cn } from '@alikhalilll/a-ui-base';\nimport type { ASkeletonLayerProps, ShapeNodeType } from '../types';\n\nconst props = withDefaults(defineProps<ASkeletonLayerProps>(), {\n animation: 'shimmer',\n});\n\nconst animationClass = computed(() =>\n props.animation === 'none' ? null : `a-skel-block--anim-${props.animation}`\n);\n\nconst layerStyle = computed<CSSProperties>(() =>\n props.shape ? { width: `${props.shape.width}px`, height: `${props.shape.height}px` } : {}\n);\n\n/* Pre-joined per-type class strings — see ASkeleton.vue for the rationale. */\nconst blockClassByType = computed<Readonly<Record<ShapeNodeType, string>>>(() => {\n const anim = animationClass.value;\n const suffix = anim ? ` ${anim}` : '';\n return Object.freeze({\n block: `a-skel-block a-skel-block--block${suffix}`,\n text: `a-skel-block a-skel-block--text${suffix}`,\n image: `a-skel-block a-skel-block--image${suffix}`,\n circle: `a-skel-block a-skel-block--circle${suffix}`,\n });\n});\n</script>\n\n<template>\n <div\n v-if=\"shape\"\n :class=\"cn('a-skeleton__layer', props.class)\"\n :style=\"layerStyle\"\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n >\n <template v-for=\"(node, idx) in shape.nodes\" :key=\"idx\">\n <template v-if=\"node.lineStyles\">\n <div\n v-for=\"(lineStyle, i) in node.lineStyles\"\n :key=\"`${idx}-${i}`\"\n :class=\"blockClassByType.text\"\n :style=\"lineStyle\"\n />\n </template>\n <div v-else :class=\"blockClassByType[node.type]\" :style=\"node.style\" />\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, type CSSProperties } from 'vue';\nimport { cn } from '@alikhalilll/a-ui-base';\nimport type { ASkeletonBlockProps } from '../types';\n\nconst props = withDefaults(defineProps<ASkeletonBlockProps>(), {\n type: 'block',\n animation: 'shimmer',\n lines: 1,\n});\n\nconst animationClass = computed(() =>\n props.animation === 'none' ? null : `a-skel-block--anim-${props.animation}`\n);\n\nconst blockClass = computed(() => [\n 'a-skel-block',\n `a-skel-block--${props.type}`,\n animationClass.value,\n]);\n\nfunction toLength(v: number | string | undefined): string | undefined {\n if (v === undefined) return undefined;\n return typeof v === 'number' ? `${v}px` : v;\n}\n\nconst radiusValue = computed(() =>\n props.type === 'circle' && props.radius === undefined ? '50%' : toLength(props.radius)\n);\n\nconst blockStyle = computed<CSSProperties>(() => ({\n width: toLength(props.w),\n height: toLength(props.h),\n borderRadius: radiusValue.value,\n}));\n\nconst isMultiLineText = computed(() => props.type === 'text' && props.lines > 1);\n</script>\n\n<template>\n <div\n v-if=\"isMultiLineText\"\n :class=\"cn('a-skel-block-stack', props.class)\"\n role=\"status\"\n aria-busy=\"true\"\n >\n <div\n v-for=\"i in props.lines\"\n :key=\"i\"\n :class=\"blockClass\"\n :style=\"{\n height: blockStyle.height ?? '0.75em',\n width: i === props.lines ? '70%' : '100%',\n borderRadius: blockStyle.borderRadius ?? '4px',\n }\"\n />\n </div>\n <div\n v-else\n :class=\"cn(blockClass, props.class)\"\n :style=\"blockStyle\"\n role=\"status\"\n aria-busy=\"true\"\n />\n</template>\n\n<style scoped>\n.a-skel-block-stack {\n display: flex;\n flex-direction: column;\n gap: 0.35rem;\n width: 100%;\n}\n</style>\n","import { shallowRef, type Ref } from 'vue';\nimport type { CachedShape } from '../types';\nimport { useShapeProbe } from './useShapeProbe';\nimport { clearCached, getCached, setCached } from './useSkeletonCache';\nimport { walkDom } from '../utils/walkDom';\n\nexport interface UseSkeletonOptions {\n /**\n * Identifier for the shape cache. Pass the same key wherever the same visual\n * structure appears so the captured shape replays everywhere.\n */\n cacheKey: string;\n /**\n * Getter for the element to measure. When it returns `null` (e.g. during the\n * loading state), no measurement happens. The probe re-arms automatically\n * once the getter returns an element again.\n *\n * Typical pattern: return `null` while loading so the real content is the\n * only thing ever measured, then the cache feeds the skeleton on the next\n * load.\n */\n target?: () => HTMLElement | null;\n /** Persist to `localStorage` so first-paint after reload skips the cold start. Default false. */\n persist?: boolean;\n /** Forwarded to `walkDom`. Default 6. */\n maxDepth?: number;\n /** Forwarded to `walkDom`. Default 500. */\n maxNodes?: number;\n /** Forwarded to `walkDom`. Default 4. */\n minSize?: number;\n /** Forwarded to `useShapeProbe`. Default 150 ms. */\n resizeDebounceMs?: number;\n}\n\nexport interface UseSkeletonReturn {\n /** Reactive captured shape — `undefined` on cache miss. Replace your skeleton render path. */\n shape: Readonly<Ref<CachedShape | undefined>>;\n /**\n * Synchronously measure the current target and write to cache. Returns the\n * captured shape, or `undefined` if the target wasn't available / nothing\n * worth measuring was rendered. Use when you want to force a capture outside\n * the automatic `ResizeObserver` flow (e.g. after an animation settles).\n */\n captureNow: () => CachedShape | undefined;\n /** Drop the cache entry for this `cacheKey`. The reactive `shape` flips to `undefined`. */\n clear: () => void;\n}\n\n/**\n * High-level building block for custom skeleton UIs. Wires up the probe + cache\n * + reactivity so the consumer just renders something using the reactive shape:\n *\n * ```ts\n * const containerRef = ref<HTMLElement | null>(null);\n * const { shape } = useSkeleton({\n * cacheKey: 'user-card',\n * target: () => (loading.value ? null : containerRef.value),\n * });\n * ```\n *\n * ```vue\n * <div ref=\"containerRef\">\n * <ASkeletonLayer v-if=\"loading && shape\" :shape=\"shape\" />\n * <UserCard v-else :data=\"user\" />\n * </div>\n * ```\n *\n * For more control, drop down to `useShapeProbe` + `getCached`/`setCached` and\n * compose your own.\n */\nexport function useSkeleton(options: UseSkeletonOptions): UseSkeletonReturn {\n const persist = options.persist ?? false;\n const maxDepth = options.maxDepth ?? 6;\n\n const shape = shallowRef<CachedShape | undefined>(getCached(options.cacheKey, persist));\n\n if (options.target) {\n const getTarget = options.target;\n useShapeProbe(getTarget, {\n maxDepth,\n maxNodes: options.maxNodes,\n minSize: options.minSize,\n resizeDebounceMs: options.resizeDebounceMs,\n onCapture: (captured) => {\n setCached(options.cacheKey, captured, persist);\n shape.value = captured;\n },\n });\n }\n\n function captureNow(): CachedShape | undefined {\n const el = options.target?.();\n if (!el || typeof window === 'undefined') return undefined;\n const captured = walkDom(el, {\n maxDepth,\n maxNodes: options.maxNodes,\n minSize: options.minSize,\n });\n if (captured.width <= 0 || captured.height <= 0 || captured.nodes.length === 0)\n return undefined;\n setCached(options.cacheKey, captured, persist);\n shape.value = captured;\n return captured;\n }\n\n function clear(): void {\n clearCached(options.cacheKey);\n shape.value = undefined;\n }\n\n return { shape, captureNow, clear };\n}\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["ATOMIC_TAGS","DEFAULT_MAX_DEPTH","DEFAULT_MAX_NODES","RENDERERS","renderContainer","renderLeafWithIcon","DEFAULT_MAX_DEPTH","DEFAULT_MAX_NODES","DEFAULT_MIN_SIZE","ATOMIC_TAGS","TEXT_OWNERS","VISUAL_PROPS","capture","DEFAULT_MAX_NODES","DEFAULT_MIN_SIZE","applyVisualSignals","DEFAULT_MAX_DEPTH"],"sources":["../../../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../../../../node_modules/.pnpm/tailwind-merge@3.6.0/node_modules/tailwind-merge/dist/bundle-mjs.mjs","../../AUiBase/dist/index.js","../src/utils/buildStructuralSkeleton.ts","../src/components/StructuralSkeleton.ts","../src/components/icons.ts","../src/components/CloneNode.ts","../src/components/ASkeletonClone.vue","../src/utils/domRead.ts","../src/utils/captureStyles.ts","../src/components/ASkeleton.vue","../src/components/StructuralLayerNode.ts","../src/components/ASkeletonLayer.vue","../src/components/ASkeletonBlock.vue","../src/components/variants/ASkeletonText.vue","../src/components/variants/ASkeletonHeading.vue","../src/components/variants/ASkeletonAvatar.vue","../src/components/variants/ASkeletonImage.vue","../src/components/variants/ASkeletonVideo.vue","../src/components/variants/ASkeletonButton.vue","../src/components/variants/ASkeletonInput.vue","../src/components/variants/ASkeletonListItem.vue","../src/components/variants/ASkeletonCard.vue","../src/components/variants/ASkeletonTable.vue","../src/components/variants/ASkeletonChart.vue","../src/components/variants/ASkeletonForm.vue","../src/components/variants/ASkeletonArticle.vue","../src/components/variants/ASkeletonDivider.vue","../src/components/variants/ASkeletonChip.vue","../src/utils/walkDom.ts","../src/composables/useShapeProbe.ts","../src/composables/useSkeletonCache.ts","../src/utils/walkStructural.ts","../src/composables/useSkeleton.ts","../src/utils/fingerprint.ts"],"sourcesContent":["function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","/**\n * Concatenates two arrays faster than the array spread operator.\n */\nconst concatArrays = (array1, array2) => {\n // Pre-allocate for better V8 optimization\n const combinedArray = new Array(array1.length + array2.length);\n for (let i = 0; i < array1.length; i++) {\n combinedArray[i] = array1[i];\n }\n for (let i = 0; i < array2.length; i++) {\n combinedArray[array1.length + i] = array2[i];\n }\n return combinedArray;\n};\n\n// Factory function ensures consistent object shapes\nconst createClassValidatorObject = (classGroupId, validator) => ({\n classGroupId,\n validator\n});\n// Factory ensures consistent ClassPartObject shape\nconst createClassPartObject = (nextPart = new Map(), validators = null, classGroupId) => ({\n nextPart,\n validators,\n classGroupId\n});\nconst CLASS_PART_SEPARATOR = '-';\nconst EMPTY_CONFLICTS = [];\n// I use two dots here because one dot is used as prefix for class groups in plugins\nconst ARBITRARY_PROPERTY_PREFIX = 'arbitrary..';\nconst createClassGroupUtils = config => {\n const classMap = createClassMap(config);\n const {\n conflictingClassGroups,\n conflictingClassGroupModifiers\n } = config;\n const getClassGroupId = className => {\n if (className.startsWith('[') && className.endsWith(']')) {\n return getGroupIdForArbitraryProperty(className);\n }\n const classParts = className.split(CLASS_PART_SEPARATOR);\n // Classes like `-inset-1` produce an empty string as first classPart. We assume that classes for negative values are used correctly and skip it.\n const startIndex = classParts[0] === '' && classParts.length > 1 ? 1 : 0;\n return getGroupRecursive(classParts, startIndex, classMap);\n };\n const getConflictingClassGroupIds = (classGroupId, hasPostfixModifier) => {\n if (hasPostfixModifier) {\n const modifierConflicts = conflictingClassGroupModifiers[classGroupId];\n const baseConflicts = conflictingClassGroups[classGroupId];\n if (modifierConflicts) {\n if (baseConflicts) {\n // Merge base conflicts with modifier conflicts\n return concatArrays(baseConflicts, modifierConflicts);\n }\n // Only modifier conflicts\n return modifierConflicts;\n }\n // Fall back to without postfix if no modifier conflicts\n return baseConflicts || EMPTY_CONFLICTS;\n }\n return conflictingClassGroups[classGroupId] || EMPTY_CONFLICTS;\n };\n return {\n getClassGroupId,\n getConflictingClassGroupIds\n };\n};\nconst getGroupRecursive = (classParts, startIndex, classPartObject) => {\n const classPathsLength = classParts.length - startIndex;\n if (classPathsLength === 0) {\n return classPartObject.classGroupId;\n }\n const currentClassPart = classParts[startIndex];\n const nextClassPartObject = classPartObject.nextPart.get(currentClassPart);\n if (nextClassPartObject) {\n const result = getGroupRecursive(classParts, startIndex + 1, nextClassPartObject);\n if (result) return result;\n }\n const validators = classPartObject.validators;\n if (validators === null) {\n return undefined;\n }\n // Build classRest string efficiently by joining from startIndex onwards\n const classRest = startIndex === 0 ? classParts.join(CLASS_PART_SEPARATOR) : classParts.slice(startIndex).join(CLASS_PART_SEPARATOR);\n const validatorsLength = validators.length;\n for (let i = 0; i < validatorsLength; i++) {\n const validatorObj = validators[i];\n if (validatorObj.validator(classRest)) {\n return validatorObj.classGroupId;\n }\n }\n return undefined;\n};\n/**\n * Get the class group ID for an arbitrary property.\n *\n * @param className - The class name to get the group ID for. Is expected to be string starting with `[` and ending with `]`.\n */\nconst getGroupIdForArbitraryProperty = className => className.slice(1, -1).indexOf(':') === -1 ? undefined : (() => {\n const content = className.slice(1, -1);\n const colonIndex = content.indexOf(':');\n const property = content.slice(0, colonIndex);\n return property ? ARBITRARY_PROPERTY_PREFIX + property : undefined;\n})();\n/**\n * Exported for testing only\n */\nconst createClassMap = config => {\n const {\n theme,\n classGroups\n } = config;\n return processClassGroups(classGroups, theme);\n};\n// Split into separate functions to maintain monomorphic call sites\nconst processClassGroups = (classGroups, theme) => {\n const classMap = createClassPartObject();\n for (const classGroupId in classGroups) {\n const group = classGroups[classGroupId];\n processClassesRecursively(group, classMap, classGroupId, theme);\n }\n return classMap;\n};\nconst processClassesRecursively = (classGroup, classPartObject, classGroupId, theme) => {\n const len = classGroup.length;\n for (let i = 0; i < len; i++) {\n const classDefinition = classGroup[i];\n processClassDefinition(classDefinition, classPartObject, classGroupId, theme);\n }\n};\n// Split into separate functions for each type to maintain monomorphic call sites\nconst processClassDefinition = (classDefinition, classPartObject, classGroupId, theme) => {\n if (typeof classDefinition === 'string') {\n processStringDefinition(classDefinition, classPartObject, classGroupId);\n return;\n }\n if (typeof classDefinition === 'function') {\n processFunctionDefinition(classDefinition, classPartObject, classGroupId, theme);\n return;\n }\n processObjectDefinition(classDefinition, classPartObject, classGroupId, theme);\n};\nconst processStringDefinition = (classDefinition, classPartObject, classGroupId) => {\n const classPartObjectToEdit = classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition);\n classPartObjectToEdit.classGroupId = classGroupId;\n};\nconst processFunctionDefinition = (classDefinition, classPartObject, classGroupId, theme) => {\n if (isThemeGetter(classDefinition)) {\n processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme);\n return;\n }\n if (classPartObject.validators === null) {\n classPartObject.validators = [];\n }\n classPartObject.validators.push(createClassValidatorObject(classGroupId, classDefinition));\n};\nconst processObjectDefinition = (classDefinition, classPartObject, classGroupId, theme) => {\n const entries = Object.entries(classDefinition);\n const len = entries.length;\n for (let i = 0; i < len; i++) {\n const [key, value] = entries[i];\n processClassesRecursively(value, getPart(classPartObject, key), classGroupId, theme);\n }\n};\nconst getPart = (classPartObject, path) => {\n let current = classPartObject;\n const parts = path.split(CLASS_PART_SEPARATOR);\n const len = parts.length;\n for (let i = 0; i < len; i++) {\n const part = parts[i];\n let next = current.nextPart.get(part);\n if (!next) {\n next = createClassPartObject();\n current.nextPart.set(part, next);\n }\n current = next;\n }\n return current;\n};\n// Type guard maintains monomorphic check\nconst isThemeGetter = func => 'isThemeGetter' in func && func.isThemeGetter === true;\n\n// LRU cache implementation using plain objects for simplicity\nconst createLruCache = maxCacheSize => {\n if (maxCacheSize < 1) {\n return {\n get: () => undefined,\n set: () => {}\n };\n }\n let cacheSize = 0;\n let cache = Object.create(null);\n let previousCache = Object.create(null);\n const update = (key, value) => {\n cache[key] = value;\n cacheSize++;\n if (cacheSize > maxCacheSize) {\n cacheSize = 0;\n previousCache = cache;\n cache = Object.create(null);\n }\n };\n return {\n get(key) {\n let value = cache[key];\n if (value !== undefined) {\n return value;\n }\n if ((value = previousCache[key]) !== undefined) {\n update(key, value);\n return value;\n }\n },\n set(key, value) {\n if (key in cache) {\n cache[key] = value;\n } else {\n update(key, value);\n }\n }\n };\n};\nconst IMPORTANT_MODIFIER = '!';\nconst MODIFIER_SEPARATOR = ':';\nconst EMPTY_MODIFIERS = [];\n// Pre-allocated result object shape for consistency\nconst createResultObject = (modifiers, hasImportantModifier, baseClassName, maybePostfixModifierPosition, isExternal) => ({\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition,\n isExternal\n});\nconst createParseClassName = config => {\n const {\n prefix,\n experimentalParseClassName\n } = config;\n /**\n * Parse class name into parts.\n *\n * Inspired by `splitAtTopLevelOnly` used in Tailwind CSS\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v3.2.2/src/util/splitAtTopLevelOnly.js\n */\n let parseClassName = className => {\n // Use simple array with push for better performance\n const modifiers = [];\n let bracketDepth = 0;\n let parenDepth = 0;\n let modifierStart = 0;\n let postfixModifierPosition;\n const len = className.length;\n for (let index = 0; index < len; index++) {\n const currentCharacter = className[index];\n if (bracketDepth === 0 && parenDepth === 0) {\n if (currentCharacter === MODIFIER_SEPARATOR) {\n modifiers.push(className.slice(modifierStart, index));\n modifierStart = index + 1;\n continue;\n }\n if (currentCharacter === '/') {\n postfixModifierPosition = index;\n continue;\n }\n }\n if (currentCharacter === '[') bracketDepth++;else if (currentCharacter === ']') bracketDepth--;else if (currentCharacter === '(') parenDepth++;else if (currentCharacter === ')') parenDepth--;\n }\n const baseClassNameWithImportantModifier = modifiers.length === 0 ? className : className.slice(modifierStart);\n // Inline important modifier check\n let baseClassName = baseClassNameWithImportantModifier;\n let hasImportantModifier = false;\n if (baseClassNameWithImportantModifier.endsWith(IMPORTANT_MODIFIER)) {\n baseClassName = baseClassNameWithImportantModifier.slice(0, -1);\n hasImportantModifier = true;\n } else if (\n /**\n * In Tailwind CSS v3 the important modifier was at the start of the base class name. This is still supported for legacy reasons.\n * @see https://github.com/dcastil/tailwind-merge/issues/513#issuecomment-2614029864\n */\n baseClassNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER)) {\n baseClassName = baseClassNameWithImportantModifier.slice(1);\n hasImportantModifier = true;\n }\n const maybePostfixModifierPosition = postfixModifierPosition && postfixModifierPosition > modifierStart ? postfixModifierPosition - modifierStart : undefined;\n return createResultObject(modifiers, hasImportantModifier, baseClassName, maybePostfixModifierPosition);\n };\n if (prefix) {\n const fullPrefix = prefix + MODIFIER_SEPARATOR;\n const parseClassNameOriginal = parseClassName;\n parseClassName = className => className.startsWith(fullPrefix) ? parseClassNameOriginal(className.slice(fullPrefix.length)) : createResultObject(EMPTY_MODIFIERS, false, className, undefined, true);\n }\n if (experimentalParseClassName) {\n const parseClassNameOriginal = parseClassName;\n parseClassName = className => experimentalParseClassName({\n className,\n parseClassName: parseClassNameOriginal\n });\n }\n return parseClassName;\n};\n\n/**\n * Sorts modifiers according to following schema:\n * - Predefined modifiers are sorted alphabetically\n * - When an arbitrary variant appears, it must be preserved which modifiers are before and after it\n */\nconst createSortModifiers = config => {\n // Pre-compute weights for all known modifiers for O(1) comparison\n const modifierWeights = new Map();\n // Assign weights to sensitive modifiers (highest priority, but preserve order)\n config.orderSensitiveModifiers.forEach((mod, index) => {\n modifierWeights.set(mod, 1000000 + index); // High weights for sensitive mods\n });\n return modifiers => {\n const result = [];\n let currentSegment = [];\n // Process modifiers in one pass\n for (let i = 0; i < modifiers.length; i++) {\n const modifier = modifiers[i];\n // Check if modifier is sensitive (starts with '[' or in orderSensitiveModifiers)\n const isArbitrary = modifier[0] === '[';\n const isOrderSensitive = modifierWeights.has(modifier);\n if (isArbitrary || isOrderSensitive) {\n // Sort and flush current segment alphabetically\n if (currentSegment.length > 0) {\n currentSegment.sort();\n result.push(...currentSegment);\n currentSegment = [];\n }\n result.push(modifier);\n } else {\n // Regular modifier - add to current segment for batch sorting\n currentSegment.push(modifier);\n }\n }\n // Sort and add any remaining segment items\n if (currentSegment.length > 0) {\n currentSegment.sort();\n result.push(...currentSegment);\n }\n return result;\n };\n};\nconst createConfigUtils = config => ({\n cache: createLruCache(config.cacheSize),\n parseClassName: createParseClassName(config),\n sortModifiers: createSortModifiers(config),\n postfixLookupClassGroupIds: createPostfixLookupClassGroupIds(config),\n ...createClassGroupUtils(config)\n});\nconst createPostfixLookupClassGroupIds = config => {\n const lookup = Object.create(null);\n const classGroupIds = config.postfixLookupClassGroups;\n if (classGroupIds) {\n for (let i = 0; i < classGroupIds.length; i++) {\n lookup[classGroupIds[i]] = true;\n }\n }\n return lookup;\n};\nconst SPLIT_CLASSES_REGEX = /\\s+/;\nconst mergeClassList = (classList, configUtils) => {\n const {\n parseClassName,\n getClassGroupId,\n getConflictingClassGroupIds,\n sortModifiers,\n postfixLookupClassGroupIds\n } = configUtils;\n /**\n * Set of classGroupIds in following format:\n * `{importantModifier}{variantModifiers}{classGroupId}`\n * @example 'float'\n * @example 'hover:focus:bg-color'\n * @example 'md:!pr'\n */\n const classGroupsInConflict = [];\n const classNames = classList.trim().split(SPLIT_CLASSES_REGEX);\n let result = '';\n for (let index = classNames.length - 1; index >= 0; index -= 1) {\n const originalClassName = classNames[index];\n const {\n isExternal,\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition\n } = parseClassName(originalClassName);\n if (isExternal) {\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n let hasPostfixModifier = !!maybePostfixModifierPosition;\n let classGroupId;\n if (hasPostfixModifier) {\n const baseClassNameWithoutPostfix = baseClassName.substring(0, maybePostfixModifierPosition);\n classGroupId = getClassGroupId(baseClassNameWithoutPostfix);\n const classGroupIdWithPostfix = classGroupId && postfixLookupClassGroupIds[classGroupId] ? getClassGroupId(baseClassName) : undefined;\n if (classGroupIdWithPostfix && classGroupIdWithPostfix !== classGroupId) {\n classGroupId = classGroupIdWithPostfix;\n hasPostfixModifier = false;\n }\n } else {\n classGroupId = getClassGroupId(baseClassName);\n }\n if (!classGroupId) {\n if (!hasPostfixModifier) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n classGroupId = getClassGroupId(baseClassName);\n if (!classGroupId) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n hasPostfixModifier = false;\n }\n // Fast path: skip sorting for empty or single modifier\n const variantModifier = modifiers.length === 0 ? '' : modifiers.length === 1 ? modifiers[0] : sortModifiers(modifiers).join(':');\n const modifierId = hasImportantModifier ? variantModifier + IMPORTANT_MODIFIER : variantModifier;\n const classId = modifierId + classGroupId;\n if (classGroupsInConflict.indexOf(classId) > -1) {\n // Tailwind class omitted due to conflict\n continue;\n }\n classGroupsInConflict.push(classId);\n const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier);\n for (let i = 0; i < conflictGroups.length; ++i) {\n const group = conflictGroups[i];\n classGroupsInConflict.push(modifierId + group);\n }\n // Tailwind class not in conflict\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n }\n return result;\n};\n\n/**\n * The code in this file is copied from https://github.com/lukeed/clsx and modified to suit the needs of tailwind-merge better.\n *\n * Specifically:\n * - Runtime code from https://github.com/lukeed/clsx/blob/v1.2.1/src/index.js\n * - TypeScript types from https://github.com/lukeed/clsx/blob/v1.2.1/clsx.d.ts\n *\n * Original code has MIT license: Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)\n */\nconst twJoin = (...classLists) => {\n let index = 0;\n let argument;\n let resolvedValue;\n let string = '';\n while (index < classLists.length) {\n if (argument = classLists[index++]) {\n if (resolvedValue = toValue(argument)) {\n string && (string += ' ');\n string += resolvedValue;\n }\n }\n }\n return string;\n};\nconst toValue = mix => {\n // Fast path for strings\n if (typeof mix === 'string') {\n return mix;\n }\n let resolvedValue;\n let string = '';\n for (let k = 0; k < mix.length; k++) {\n if (mix[k]) {\n if (resolvedValue = toValue(mix[k])) {\n string && (string += ' ');\n string += resolvedValue;\n }\n }\n }\n return string;\n};\nconst createTailwindMerge = (createConfigFirst, ...createConfigRest) => {\n let configUtils;\n let cacheGet;\n let cacheSet;\n let functionToCall;\n const initTailwindMerge = classList => {\n const config = createConfigRest.reduce((previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig), createConfigFirst());\n configUtils = createConfigUtils(config);\n cacheGet = configUtils.cache.get;\n cacheSet = configUtils.cache.set;\n functionToCall = tailwindMerge;\n return tailwindMerge(classList);\n };\n const tailwindMerge = classList => {\n const cachedResult = cacheGet(classList);\n if (cachedResult) {\n return cachedResult;\n }\n const result = mergeClassList(classList, configUtils);\n cacheSet(classList, result);\n return result;\n };\n functionToCall = initTailwindMerge;\n return (...args) => functionToCall(twJoin(...args));\n};\nconst fallbackThemeArr = [];\nconst fromTheme = key => {\n const themeGetter = theme => theme[key] || fallbackThemeArr;\n themeGetter.isThemeGetter = true;\n return themeGetter;\n};\nconst arbitraryValueRegex = /^\\[(?:(\\w[\\w-]*):)?(.+)\\]$/i;\nconst arbitraryVariableRegex = /^\\((?:(\\w[\\w-]*):)?(.+)\\)$/i;\nconst fractionRegex = /^\\d+(?:\\.\\d+)?\\/\\d+(?:\\.\\d+)?$/;\nconst tshirtUnitRegex = /^(\\d+(\\.\\d+)?)?(xs|sm|md|lg|xl)$/;\nconst 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$/;\nconst colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\\(.+\\)$/;\n// Shadow always begins with x and y offset separated by underscore optionally prepended by inset\nconst shadowRegex = /^(inset_)?-?((\\d+)?\\.?(\\d+)[a-z]+|0)_-?((\\d+)?\\.?(\\d+)[a-z]+|0)/;\nconst imageRegex = /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\\(.+\\)$/;\nconst isFraction = value => fractionRegex.test(value);\nconst isNumber = value => !!value && !Number.isNaN(Number(value));\nconst isInteger = value => !!value && Number.isInteger(Number(value));\nconst isPercent = value => value.endsWith('%') && isNumber(value.slice(0, -1));\nconst isTshirtSize = value => tshirtUnitRegex.test(value);\nconst isAny = () => true;\nconst isLengthOnly = value =>\n// `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.\n// For example, `hsl(0 0% 0%)` would be classified as a length without this check.\n// I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.\nlengthUnitRegex.test(value) && !colorFunctionRegex.test(value);\nconst isNever = () => false;\nconst isShadow = value => shadowRegex.test(value);\nconst isImage = value => imageRegex.test(value);\nconst isAnyNonArbitrary = value => !isArbitraryValue(value) && !isArbitraryVariable(value);\nconst isNamedContainerQuery = value => value.startsWith('@container') && (value[10] === '/' && value[11] !== undefined || value[11] === 's' && value[16] !== undefined && value.startsWith('-size/', 10) || value[11] === 'n' && value[18] !== undefined && value.startsWith('-normal/', 10));\nconst isArbitrarySize = value => getIsArbitraryValue(value, isLabelSize, isNever);\nconst isArbitraryValue = value => arbitraryValueRegex.test(value);\nconst isArbitraryLength = value => getIsArbitraryValue(value, isLabelLength, isLengthOnly);\nconst isArbitraryNumber = value => getIsArbitraryValue(value, isLabelNumber, isNumber);\nconst isArbitraryWeight = value => getIsArbitraryValue(value, isLabelWeight, isAny);\nconst isArbitraryFamilyName = value => getIsArbitraryValue(value, isLabelFamilyName, isNever);\nconst isArbitraryPosition = value => getIsArbitraryValue(value, isLabelPosition, isNever);\nconst isArbitraryImage = value => getIsArbitraryValue(value, isLabelImage, isImage);\nconst isArbitraryShadow = value => getIsArbitraryValue(value, isLabelShadow, isShadow);\nconst isArbitraryVariable = value => arbitraryVariableRegex.test(value);\nconst isArbitraryVariableLength = value => getIsArbitraryVariable(value, isLabelLength);\nconst isArbitraryVariableFamilyName = value => getIsArbitraryVariable(value, isLabelFamilyName);\nconst isArbitraryVariablePosition = value => getIsArbitraryVariable(value, isLabelPosition);\nconst isArbitraryVariableSize = value => getIsArbitraryVariable(value, isLabelSize);\nconst isArbitraryVariableImage = value => getIsArbitraryVariable(value, isLabelImage);\nconst isArbitraryVariableShadow = value => getIsArbitraryVariable(value, isLabelShadow, true);\nconst isArbitraryVariableWeight = value => getIsArbitraryVariable(value, isLabelWeight, true);\n// Helpers\nconst getIsArbitraryValue = (value, testLabel, testValue) => {\n const result = arbitraryValueRegex.exec(value);\n if (result) {\n if (result[1]) {\n return testLabel(result[1]);\n }\n return testValue(result[2]);\n }\n return false;\n};\nconst getIsArbitraryVariable = (value, testLabel, shouldMatchNoLabel = false) => {\n const result = arbitraryVariableRegex.exec(value);\n if (result) {\n if (result[1]) {\n return testLabel(result[1]);\n }\n return shouldMatchNoLabel;\n }\n return false;\n};\n// Labels\nconst isLabelPosition = label => label === 'position' || label === 'percentage';\nconst isLabelImage = label => label === 'image' || label === 'url';\nconst isLabelSize = label => label === 'length' || label === 'size' || label === 'bg-size';\nconst isLabelLength = label => label === 'length';\nconst isLabelNumber = label => label === 'number';\nconst isLabelFamilyName = label => label === 'family-name';\nconst isLabelWeight = label => label === 'number' || label === 'weight';\nconst isLabelShadow = label => label === 'shadow';\nconst validators = /*#__PURE__*/Object.defineProperty({\n __proto__: null,\n isAny,\n isAnyNonArbitrary,\n isArbitraryFamilyName,\n isArbitraryImage,\n isArbitraryLength,\n isArbitraryNumber,\n isArbitraryPosition,\n isArbitraryShadow,\n isArbitrarySize,\n isArbitraryValue,\n isArbitraryVariable,\n isArbitraryVariableFamilyName,\n isArbitraryVariableImage,\n isArbitraryVariableLength,\n isArbitraryVariablePosition,\n isArbitraryVariableShadow,\n isArbitraryVariableSize,\n isArbitraryVariableWeight,\n isArbitraryWeight,\n isFraction,\n isInteger,\n isNamedContainerQuery,\n isNumber,\n isPercent,\n isTshirtSize\n}, Symbol.toStringTag, {\n value: 'Module'\n});\nconst getDefaultConfig = () => {\n /**\n * Theme getters for theme variable namespaces\n * @see https://tailwindcss.com/docs/theme#theme-variable-namespaces\n */\n /***/\n const themeColor = fromTheme('color');\n const themeFont = fromTheme('font');\n const themeText = fromTheme('text');\n const themeFontWeight = fromTheme('font-weight');\n const themeTracking = fromTheme('tracking');\n const themeLeading = fromTheme('leading');\n const themeBreakpoint = fromTheme('breakpoint');\n const themeContainer = fromTheme('container');\n const themeSpacing = fromTheme('spacing');\n const themeRadius = fromTheme('radius');\n const themeShadow = fromTheme('shadow');\n const themeInsetShadow = fromTheme('inset-shadow');\n const themeTextShadow = fromTheme('text-shadow');\n const themeDropShadow = fromTheme('drop-shadow');\n const themeBlur = fromTheme('blur');\n const themePerspective = fromTheme('perspective');\n const themeAspect = fromTheme('aspect');\n const themeEase = fromTheme('ease');\n const themeAnimate = fromTheme('animate');\n /**\n * Helpers to avoid repeating the same scales\n *\n * We use functions that create a new array every time they're called instead of static arrays.\n * 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.\n */\n /***/\n const scaleBreak = () => ['auto', 'avoid', 'all', 'avoid-page', 'page', 'left', 'right', 'column'];\n const scalePosition = () => ['center', 'top', 'bottom', 'left', 'right', 'top-left',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'left-top', 'top-right',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'right-top', 'bottom-right',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'right-bottom', 'bottom-left',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'left-bottom'];\n const scalePositionWithArbitrary = () => [...scalePosition(), isArbitraryVariable, isArbitraryValue];\n const scaleOverflow = () => ['auto', 'hidden', 'clip', 'visible', 'scroll'];\n const scaleOverscroll = () => ['auto', 'contain', 'none'];\n const scaleUnambiguousSpacing = () => [isArbitraryVariable, isArbitraryValue, themeSpacing];\n const scaleInset = () => [isFraction, 'full', 'auto', ...scaleUnambiguousSpacing()];\n const scaleGridTemplateColsRows = () => [isInteger, 'none', 'subgrid', isArbitraryVariable, isArbitraryValue];\n const scaleGridColRowStartAndEnd = () => ['auto', {\n span: ['full', isInteger, isArbitraryVariable, isArbitraryValue]\n }, isInteger, isArbitraryVariable, isArbitraryValue];\n const scaleGridColRowStartOrEnd = () => [isInteger, 'auto', isArbitraryVariable, isArbitraryValue];\n const scaleGridAutoColsRows = () => ['auto', 'min', 'max', 'fr', isArbitraryVariable, isArbitraryValue];\n const scaleAlignPrimaryAxis = () => ['start', 'end', 'center', 'between', 'around', 'evenly', 'stretch', 'baseline', 'center-safe', 'end-safe'];\n const scaleAlignSecondaryAxis = () => ['start', 'end', 'center', 'stretch', 'center-safe', 'end-safe'];\n const scaleMargin = () => ['auto', ...scaleUnambiguousSpacing()];\n const scaleSizing = () => [isFraction, 'auto', 'full', 'dvw', 'dvh', 'lvw', 'lvh', 'svw', 'svh', 'min', 'max', 'fit', ...scaleUnambiguousSpacing()];\n const scaleSizingInline = () => [isFraction, 'screen', 'full', 'dvw', 'lvw', 'svw', 'min', 'max', 'fit', ...scaleUnambiguousSpacing()];\n const scaleSizingBlock = () => [isFraction, 'screen', 'full', 'lh', 'dvh', 'lvh', 'svh', 'min', 'max', 'fit', ...scaleUnambiguousSpacing()];\n const scaleColor = () => [themeColor, isArbitraryVariable, isArbitraryValue];\n const scaleBgPosition = () => [...scalePosition(), isArbitraryVariablePosition, isArbitraryPosition, {\n position: [isArbitraryVariable, isArbitraryValue]\n }];\n const scaleBgRepeat = () => ['no-repeat', {\n repeat: ['', 'x', 'y', 'space', 'round']\n }];\n const scaleBgSize = () => ['auto', 'cover', 'contain', isArbitraryVariableSize, isArbitrarySize, {\n size: [isArbitraryVariable, isArbitraryValue]\n }];\n const scaleGradientStopPosition = () => [isPercent, isArbitraryVariableLength, isArbitraryLength];\n const scaleRadius = () => [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', 'full', themeRadius, isArbitraryVariable, isArbitraryValue];\n const scaleBorderWidth = () => ['', isNumber, isArbitraryVariableLength, isArbitraryLength];\n const scaleLineStyle = () => ['solid', 'dashed', 'dotted', 'double'];\n const scaleBlendMode = () => ['normal', 'multiply', 'screen', 'overlay', 'darken', 'lighten', 'color-dodge', 'color-burn', 'hard-light', 'soft-light', 'difference', 'exclusion', 'hue', 'saturation', 'color', 'luminosity'];\n const scaleMaskImagePosition = () => [isNumber, isPercent, isArbitraryVariablePosition, isArbitraryPosition];\n const scaleBlur = () => [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', themeBlur, isArbitraryVariable, isArbitraryValue];\n const scaleRotate = () => ['none', isNumber, isArbitraryVariable, isArbitraryValue];\n const scaleScale = () => ['none', isNumber, isArbitraryVariable, isArbitraryValue];\n const scaleSkew = () => [isNumber, isArbitraryVariable, isArbitraryValue];\n const scaleTranslate = () => [isFraction, 'full', ...scaleUnambiguousSpacing()];\n return {\n cacheSize: 500,\n theme: {\n animate: ['spin', 'ping', 'pulse', 'bounce'],\n aspect: ['video'],\n blur: [isTshirtSize],\n breakpoint: [isTshirtSize],\n color: [isAny],\n container: [isTshirtSize],\n 'drop-shadow': [isTshirtSize],\n ease: ['in', 'out', 'in-out'],\n font: [isAnyNonArbitrary],\n 'font-weight': ['thin', 'extralight', 'light', 'normal', 'medium', 'semibold', 'bold', 'extrabold', 'black'],\n 'inset-shadow': [isTshirtSize],\n leading: ['none', 'tight', 'snug', 'normal', 'relaxed', 'loose'],\n perspective: ['dramatic', 'near', 'normal', 'midrange', 'distant', 'none'],\n radius: [isTshirtSize],\n shadow: [isTshirtSize],\n spacing: ['px', isNumber],\n text: [isTshirtSize],\n 'text-shadow': [isTshirtSize],\n tracking: ['tighter', 'tight', 'normal', 'wide', 'wider', 'widest']\n },\n classGroups: {\n // --------------\n // --- Layout ---\n // --------------\n /**\n * Aspect Ratio\n * @see https://tailwindcss.com/docs/aspect-ratio\n */\n aspect: [{\n aspect: ['auto', 'square', isFraction, isArbitraryValue, isArbitraryVariable, themeAspect]\n }],\n /**\n * Container\n * @see https://tailwindcss.com/docs/container\n * @deprecated since Tailwind CSS v4.0.0\n */\n container: ['container'],\n /**\n * Container Type\n * @see https://tailwindcss.com/docs/responsive-design#container-queries\n */\n 'container-type': [{\n '@container': ['', 'normal', 'size', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Container Name\n * @see https://tailwindcss.com/docs/responsive-design#named-containers\n */\n 'container-named': [isNamedContainerQuery],\n /**\n * Columns\n * @see https://tailwindcss.com/docs/columns\n */\n columns: [{\n columns: [isNumber, isArbitraryValue, isArbitraryVariable, themeContainer]\n }],\n /**\n * Break After\n * @see https://tailwindcss.com/docs/break-after\n */\n 'break-after': [{\n 'break-after': scaleBreak()\n }],\n /**\n * Break Before\n * @see https://tailwindcss.com/docs/break-before\n */\n 'break-before': [{\n 'break-before': scaleBreak()\n }],\n /**\n * Break Inside\n * @see https://tailwindcss.com/docs/break-inside\n */\n 'break-inside': [{\n 'break-inside': ['auto', 'avoid', 'avoid-page', 'avoid-column']\n }],\n /**\n * Box Decoration Break\n * @see https://tailwindcss.com/docs/box-decoration-break\n */\n 'box-decoration': [{\n 'box-decoration': ['slice', 'clone']\n }],\n /**\n * Box Sizing\n * @see https://tailwindcss.com/docs/box-sizing\n */\n box: [{\n box: ['border', 'content']\n }],\n /**\n * Display\n * @see https://tailwindcss.com/docs/display\n */\n display: ['block', 'inline-block', 'inline', 'flex', 'inline-flex', 'table', 'inline-table', 'table-caption', 'table-cell', 'table-column', 'table-column-group', 'table-footer-group', 'table-header-group', 'table-row-group', 'table-row', 'flow-root', 'grid', 'inline-grid', 'contents', 'list-item', 'hidden'],\n /**\n * Screen Reader Only\n * @see https://tailwindcss.com/docs/display#screen-reader-only\n */\n sr: ['sr-only', 'not-sr-only'],\n /**\n * Floats\n * @see https://tailwindcss.com/docs/float\n */\n float: [{\n float: ['right', 'left', 'none', 'start', 'end']\n }],\n /**\n * Clear\n * @see https://tailwindcss.com/docs/clear\n */\n clear: [{\n clear: ['left', 'right', 'both', 'none', 'start', 'end']\n }],\n /**\n * Isolation\n * @see https://tailwindcss.com/docs/isolation\n */\n isolation: ['isolate', 'isolation-auto'],\n /**\n * Object Fit\n * @see https://tailwindcss.com/docs/object-fit\n */\n 'object-fit': [{\n object: ['contain', 'cover', 'fill', 'none', 'scale-down']\n }],\n /**\n * Object Position\n * @see https://tailwindcss.com/docs/object-position\n */\n 'object-position': [{\n object: scalePositionWithArbitrary()\n }],\n /**\n * Overflow\n * @see https://tailwindcss.com/docs/overflow\n */\n overflow: [{\n overflow: scaleOverflow()\n }],\n /**\n * Overflow X\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-x': [{\n 'overflow-x': scaleOverflow()\n }],\n /**\n * Overflow Y\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-y': [{\n 'overflow-y': scaleOverflow()\n }],\n /**\n * Overscroll Behavior\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n overscroll: [{\n overscroll: scaleOverscroll()\n }],\n /**\n * Overscroll Behavior X\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-x': [{\n 'overscroll-x': scaleOverscroll()\n }],\n /**\n * Overscroll Behavior Y\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-y': [{\n 'overscroll-y': scaleOverscroll()\n }],\n /**\n * Position\n * @see https://tailwindcss.com/docs/position\n */\n position: ['static', 'fixed', 'absolute', 'relative', 'sticky'],\n /**\n * Inset\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n inset: [{\n inset: scaleInset()\n }],\n /**\n * Inset Inline\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-x': [{\n 'inset-x': scaleInset()\n }],\n /**\n * Inset Block\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-y': [{\n 'inset-y': scaleInset()\n }],\n /**\n * Inset Inline Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n * @todo class group will be renamed to `inset-s` in next major release\n */\n start: [{\n 'inset-s': scaleInset(),\n /**\n * @deprecated since Tailwind CSS v4.2.0 in favor of `inset-s-*` utilities.\n * @see https://github.com/tailwindlabs/tailwindcss/pull/19613\n */\n start: scaleInset()\n }],\n /**\n * Inset Inline End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n * @todo class group will be renamed to `inset-e` in next major release\n */\n end: [{\n 'inset-e': scaleInset(),\n /**\n * @deprecated since Tailwind CSS v4.2.0 in favor of `inset-e-*` utilities.\n * @see https://github.com/tailwindlabs/tailwindcss/pull/19613\n */\n end: scaleInset()\n }],\n /**\n * Inset Block Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-bs': [{\n 'inset-bs': scaleInset()\n }],\n /**\n * Inset Block End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-be': [{\n 'inset-be': scaleInset()\n }],\n /**\n * Top\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n top: [{\n top: scaleInset()\n }],\n /**\n * Right\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n right: [{\n right: scaleInset()\n }],\n /**\n * Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n bottom: [{\n bottom: scaleInset()\n }],\n /**\n * Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n left: [{\n left: scaleInset()\n }],\n /**\n * Visibility\n * @see https://tailwindcss.com/docs/visibility\n */\n visibility: ['visible', 'invisible', 'collapse'],\n /**\n * Z-Index\n * @see https://tailwindcss.com/docs/z-index\n */\n z: [{\n z: [isInteger, 'auto', isArbitraryVariable, isArbitraryValue]\n }],\n // ------------------------\n // --- Flexbox and Grid ---\n // ------------------------\n /**\n * Flex Basis\n * @see https://tailwindcss.com/docs/flex-basis\n */\n basis: [{\n basis: [isFraction, 'full', 'auto', themeContainer, ...scaleUnambiguousSpacing()]\n }],\n /**\n * Flex Direction\n * @see https://tailwindcss.com/docs/flex-direction\n */\n 'flex-direction': [{\n flex: ['row', 'row-reverse', 'col', 'col-reverse']\n }],\n /**\n * Flex Wrap\n * @see https://tailwindcss.com/docs/flex-wrap\n */\n 'flex-wrap': [{\n flex: ['nowrap', 'wrap', 'wrap-reverse']\n }],\n /**\n * Flex\n * @see https://tailwindcss.com/docs/flex\n */\n flex: [{\n flex: [isNumber, isFraction, 'auto', 'initial', 'none', isArbitraryValue]\n }],\n /**\n * Flex Grow\n * @see https://tailwindcss.com/docs/flex-grow\n */\n grow: [{\n grow: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Flex Shrink\n * @see https://tailwindcss.com/docs/flex-shrink\n */\n shrink: [{\n shrink: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Order\n * @see https://tailwindcss.com/docs/order\n */\n order: [{\n order: [isInteger, 'first', 'last', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Grid Template Columns\n * @see https://tailwindcss.com/docs/grid-template-columns\n */\n 'grid-cols': [{\n 'grid-cols': scaleGridTemplateColsRows()\n }],\n /**\n * Grid Column Start / End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start-end': [{\n col: scaleGridColRowStartAndEnd()\n }],\n /**\n * Grid Column Start\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start': [{\n 'col-start': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Column End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-end': [{\n 'col-end': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Template Rows\n * @see https://tailwindcss.com/docs/grid-template-rows\n */\n 'grid-rows': [{\n 'grid-rows': scaleGridTemplateColsRows()\n }],\n /**\n * Grid Row Start / End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start-end': [{\n row: scaleGridColRowStartAndEnd()\n }],\n /**\n * Grid Row Start\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start': [{\n 'row-start': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Row End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-end': [{\n 'row-end': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Auto Flow\n * @see https://tailwindcss.com/docs/grid-auto-flow\n */\n 'grid-flow': [{\n 'grid-flow': ['row', 'col', 'dense', 'row-dense', 'col-dense']\n }],\n /**\n * Grid Auto Columns\n * @see https://tailwindcss.com/docs/grid-auto-columns\n */\n 'auto-cols': [{\n 'auto-cols': scaleGridAutoColsRows()\n }],\n /**\n * Grid Auto Rows\n * @see https://tailwindcss.com/docs/grid-auto-rows\n */\n 'auto-rows': [{\n 'auto-rows': scaleGridAutoColsRows()\n }],\n /**\n * Gap\n * @see https://tailwindcss.com/docs/gap\n */\n gap: [{\n gap: scaleUnambiguousSpacing()\n }],\n /**\n * Gap X\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-x': [{\n 'gap-x': scaleUnambiguousSpacing()\n }],\n /**\n * Gap Y\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-y': [{\n 'gap-y': scaleUnambiguousSpacing()\n }],\n /**\n * Justify Content\n * @see https://tailwindcss.com/docs/justify-content\n */\n 'justify-content': [{\n justify: [...scaleAlignPrimaryAxis(), 'normal']\n }],\n /**\n * Justify Items\n * @see https://tailwindcss.com/docs/justify-items\n */\n 'justify-items': [{\n 'justify-items': [...scaleAlignSecondaryAxis(), 'normal']\n }],\n /**\n * Justify Self\n * @see https://tailwindcss.com/docs/justify-self\n */\n 'justify-self': [{\n 'justify-self': ['auto', ...scaleAlignSecondaryAxis()]\n }],\n /**\n * Align Content\n * @see https://tailwindcss.com/docs/align-content\n */\n 'align-content': [{\n content: ['normal', ...scaleAlignPrimaryAxis()]\n }],\n /**\n * Align Items\n * @see https://tailwindcss.com/docs/align-items\n */\n 'align-items': [{\n items: [...scaleAlignSecondaryAxis(), {\n baseline: ['', 'last']\n }]\n }],\n /**\n * Align Self\n * @see https://tailwindcss.com/docs/align-self\n */\n 'align-self': [{\n self: ['auto', ...scaleAlignSecondaryAxis(), {\n baseline: ['', 'last']\n }]\n }],\n /**\n * Place Content\n * @see https://tailwindcss.com/docs/place-content\n */\n 'place-content': [{\n 'place-content': scaleAlignPrimaryAxis()\n }],\n /**\n * Place Items\n * @see https://tailwindcss.com/docs/place-items\n */\n 'place-items': [{\n 'place-items': [...scaleAlignSecondaryAxis(), 'baseline']\n }],\n /**\n * Place Self\n * @see https://tailwindcss.com/docs/place-self\n */\n 'place-self': [{\n 'place-self': ['auto', ...scaleAlignSecondaryAxis()]\n }],\n // Spacing\n /**\n * Padding\n * @see https://tailwindcss.com/docs/padding\n */\n p: [{\n p: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Inline\n * @see https://tailwindcss.com/docs/padding\n */\n px: [{\n px: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Block\n * @see https://tailwindcss.com/docs/padding\n */\n py: [{\n py: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Inline Start\n * @see https://tailwindcss.com/docs/padding\n */\n ps: [{\n ps: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Inline End\n * @see https://tailwindcss.com/docs/padding\n */\n pe: [{\n pe: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Block Start\n * @see https://tailwindcss.com/docs/padding\n */\n pbs: [{\n pbs: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Block End\n * @see https://tailwindcss.com/docs/padding\n */\n pbe: [{\n pbe: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Top\n * @see https://tailwindcss.com/docs/padding\n */\n pt: [{\n pt: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Right\n * @see https://tailwindcss.com/docs/padding\n */\n pr: [{\n pr: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Bottom\n * @see https://tailwindcss.com/docs/padding\n */\n pb: [{\n pb: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Left\n * @see https://tailwindcss.com/docs/padding\n */\n pl: [{\n pl: scaleUnambiguousSpacing()\n }],\n /**\n * Margin\n * @see https://tailwindcss.com/docs/margin\n */\n m: [{\n m: scaleMargin()\n }],\n /**\n * Margin Inline\n * @see https://tailwindcss.com/docs/margin\n */\n mx: [{\n mx: scaleMargin()\n }],\n /**\n * Margin Block\n * @see https://tailwindcss.com/docs/margin\n */\n my: [{\n my: scaleMargin()\n }],\n /**\n * Margin Inline Start\n * @see https://tailwindcss.com/docs/margin\n */\n ms: [{\n ms: scaleMargin()\n }],\n /**\n * Margin Inline End\n * @see https://tailwindcss.com/docs/margin\n */\n me: [{\n me: scaleMargin()\n }],\n /**\n * Margin Block Start\n * @see https://tailwindcss.com/docs/margin\n */\n mbs: [{\n mbs: scaleMargin()\n }],\n /**\n * Margin Block End\n * @see https://tailwindcss.com/docs/margin\n */\n mbe: [{\n mbe: scaleMargin()\n }],\n /**\n * Margin Top\n * @see https://tailwindcss.com/docs/margin\n */\n mt: [{\n mt: scaleMargin()\n }],\n /**\n * Margin Right\n * @see https://tailwindcss.com/docs/margin\n */\n mr: [{\n mr: scaleMargin()\n }],\n /**\n * Margin Bottom\n * @see https://tailwindcss.com/docs/margin\n */\n mb: [{\n mb: scaleMargin()\n }],\n /**\n * Margin Left\n * @see https://tailwindcss.com/docs/margin\n */\n ml: [{\n ml: scaleMargin()\n }],\n /**\n * Space Between X\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-x': [{\n 'space-x': scaleUnambiguousSpacing()\n }],\n /**\n * Space Between X Reverse\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-x-reverse': ['space-x-reverse'],\n /**\n * Space Between Y\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-y': [{\n 'space-y': scaleUnambiguousSpacing()\n }],\n /**\n * Space Between Y Reverse\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-y-reverse': ['space-y-reverse'],\n // --------------\n // --- Sizing ---\n // --------------\n /**\n * Size\n * @see https://tailwindcss.com/docs/width#setting-both-width-and-height\n */\n size: [{\n size: scaleSizing()\n }],\n /**\n * Inline Size\n * @see https://tailwindcss.com/docs/width\n */\n 'inline-size': [{\n inline: ['auto', ...scaleSizingInline()]\n }],\n /**\n * Min-Inline Size\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-inline-size': [{\n 'min-inline': ['auto', ...scaleSizingInline()]\n }],\n /**\n * Max-Inline Size\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-inline-size': [{\n 'max-inline': ['none', ...scaleSizingInline()]\n }],\n /**\n * Block Size\n * @see https://tailwindcss.com/docs/height\n */\n 'block-size': [{\n block: ['auto', ...scaleSizingBlock()]\n }],\n /**\n * Min-Block Size\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-block-size': [{\n 'min-block': ['auto', ...scaleSizingBlock()]\n }],\n /**\n * Max-Block Size\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-block-size': [{\n 'max-block': ['none', ...scaleSizingBlock()]\n }],\n /**\n * Width\n * @see https://tailwindcss.com/docs/width\n */\n w: [{\n w: [themeContainer, 'screen', ...scaleSizing()]\n }],\n /**\n * Min-Width\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-w': [{\n 'min-w': [themeContainer, 'screen', /** Deprecated. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n 'none', ...scaleSizing()]\n }],\n /**\n * Max-Width\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-w': [{\n 'max-w': [themeContainer, 'screen', 'none', /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n 'prose', /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n {\n screen: [themeBreakpoint]\n }, ...scaleSizing()]\n }],\n /**\n * Height\n * @see https://tailwindcss.com/docs/height\n */\n h: [{\n h: ['screen', 'lh', ...scaleSizing()]\n }],\n /**\n * Min-Height\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-h': [{\n 'min-h': ['screen', 'lh', 'none', ...scaleSizing()]\n }],\n /**\n * Max-Height\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-h': [{\n 'max-h': ['screen', 'lh', ...scaleSizing()]\n }],\n // ------------------\n // --- Typography ---\n // ------------------\n /**\n * Font Size\n * @see https://tailwindcss.com/docs/font-size\n */\n 'font-size': [{\n text: ['base', themeText, isArbitraryVariableLength, isArbitraryLength]\n }],\n /**\n * Font Smoothing\n * @see https://tailwindcss.com/docs/font-smoothing\n */\n 'font-smoothing': ['antialiased', 'subpixel-antialiased'],\n /**\n * Font Style\n * @see https://tailwindcss.com/docs/font-style\n */\n 'font-style': ['italic', 'not-italic'],\n /**\n * Font Weight\n * @see https://tailwindcss.com/docs/font-weight\n */\n 'font-weight': [{\n font: [themeFontWeight, isArbitraryVariableWeight, isArbitraryWeight]\n }],\n /**\n * Font Stretch\n * @see https://tailwindcss.com/docs/font-stretch\n */\n 'font-stretch': [{\n 'font-stretch': ['ultra-condensed', 'extra-condensed', 'condensed', 'semi-condensed', 'normal', 'semi-expanded', 'expanded', 'extra-expanded', 'ultra-expanded', isPercent, isArbitraryValue]\n }],\n /**\n * Font Family\n * @see https://tailwindcss.com/docs/font-family\n */\n 'font-family': [{\n font: [isArbitraryVariableFamilyName, isArbitraryFamilyName, themeFont]\n }],\n /**\n * Font Feature Settings\n * @see https://tailwindcss.com/docs/font-feature-settings\n */\n 'font-features': [{\n 'font-features': [isArbitraryValue]\n }],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-normal': ['normal-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-ordinal': ['ordinal'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-slashed-zero': ['slashed-zero'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-figure': ['lining-nums', 'oldstyle-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-spacing': ['proportional-nums', 'tabular-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-fraction': ['diagonal-fractions', 'stacked-fractions'],\n /**\n * Letter Spacing\n * @see https://tailwindcss.com/docs/letter-spacing\n */\n tracking: [{\n tracking: [themeTracking, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Line Clamp\n * @see https://tailwindcss.com/docs/line-clamp\n */\n 'line-clamp': [{\n 'line-clamp': [isNumber, 'none', isArbitraryVariable, isArbitraryNumber]\n }],\n /**\n * Line Height\n * @see https://tailwindcss.com/docs/line-height\n */\n leading: [{\n leading: [/** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n themeLeading, ...scaleUnambiguousSpacing()]\n }],\n /**\n * List Style Image\n * @see https://tailwindcss.com/docs/list-style-image\n */\n 'list-image': [{\n 'list-image': ['none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * List Style Position\n * @see https://tailwindcss.com/docs/list-style-position\n */\n 'list-style-position': [{\n list: ['inside', 'outside']\n }],\n /**\n * List Style Type\n * @see https://tailwindcss.com/docs/list-style-type\n */\n 'list-style-type': [{\n list: ['disc', 'decimal', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Text Alignment\n * @see https://tailwindcss.com/docs/text-align\n */\n 'text-alignment': [{\n text: ['left', 'center', 'right', 'justify', 'start', 'end']\n }],\n /**\n * Placeholder Color\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://v3.tailwindcss.com/docs/placeholder-color\n */\n 'placeholder-color': [{\n placeholder: scaleColor()\n }],\n /**\n * Text Color\n * @see https://tailwindcss.com/docs/text-color\n */\n 'text-color': [{\n text: scaleColor()\n }],\n /**\n * Text Decoration\n * @see https://tailwindcss.com/docs/text-decoration\n */\n 'text-decoration': ['underline', 'overline', 'line-through', 'no-underline'],\n /**\n * Text Decoration Style\n * @see https://tailwindcss.com/docs/text-decoration-style\n */\n 'text-decoration-style': [{\n decoration: [...scaleLineStyle(), 'wavy']\n }],\n /**\n * Text Decoration Thickness\n * @see https://tailwindcss.com/docs/text-decoration-thickness\n */\n 'text-decoration-thickness': [{\n decoration: [isNumber, 'from-font', 'auto', isArbitraryVariable, isArbitraryLength]\n }],\n /**\n * Text Decoration Color\n * @see https://tailwindcss.com/docs/text-decoration-color\n */\n 'text-decoration-color': [{\n decoration: scaleColor()\n }],\n /**\n * Text Underline Offset\n * @see https://tailwindcss.com/docs/text-underline-offset\n */\n 'underline-offset': [{\n 'underline-offset': [isNumber, 'auto', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Text Transform\n * @see https://tailwindcss.com/docs/text-transform\n */\n 'text-transform': ['uppercase', 'lowercase', 'capitalize', 'normal-case'],\n /**\n * Text Overflow\n * @see https://tailwindcss.com/docs/text-overflow\n */\n 'text-overflow': ['truncate', 'text-ellipsis', 'text-clip'],\n /**\n * Text Wrap\n * @see https://tailwindcss.com/docs/text-wrap\n */\n 'text-wrap': [{\n text: ['wrap', 'nowrap', 'balance', 'pretty']\n }],\n /**\n * Text Indent\n * @see https://tailwindcss.com/docs/text-indent\n */\n indent: [{\n indent: scaleUnambiguousSpacing()\n }],\n /**\n * Tab Size\n * @see https://tailwindcss.com/docs/tab-size\n */\n 'tab-size': [{\n tab: [isInteger, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Vertical Alignment\n * @see https://tailwindcss.com/docs/vertical-align\n */\n 'vertical-align': [{\n align: ['baseline', 'top', 'middle', 'bottom', 'text-top', 'text-bottom', 'sub', 'super', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Whitespace\n * @see https://tailwindcss.com/docs/whitespace\n */\n whitespace: [{\n whitespace: ['normal', 'nowrap', 'pre', 'pre-line', 'pre-wrap', 'break-spaces']\n }],\n /**\n * Word Break\n * @see https://tailwindcss.com/docs/word-break\n */\n break: [{\n break: ['normal', 'words', 'all', 'keep']\n }],\n /**\n * Overflow Wrap\n * @see https://tailwindcss.com/docs/overflow-wrap\n */\n wrap: [{\n wrap: ['break-word', 'anywhere', 'normal']\n }],\n /**\n * Hyphens\n * @see https://tailwindcss.com/docs/hyphens\n */\n hyphens: [{\n hyphens: ['none', 'manual', 'auto']\n }],\n /**\n * Content\n * @see https://tailwindcss.com/docs/content\n */\n content: [{\n content: ['none', isArbitraryVariable, isArbitraryValue]\n }],\n // -------------------\n // --- Backgrounds ---\n // -------------------\n /**\n * Background Attachment\n * @see https://tailwindcss.com/docs/background-attachment\n */\n 'bg-attachment': [{\n bg: ['fixed', 'local', 'scroll']\n }],\n /**\n * Background Clip\n * @see https://tailwindcss.com/docs/background-clip\n */\n 'bg-clip': [{\n 'bg-clip': ['border', 'padding', 'content', 'text']\n }],\n /**\n * Background Origin\n * @see https://tailwindcss.com/docs/background-origin\n */\n 'bg-origin': [{\n 'bg-origin': ['border', 'padding', 'content']\n }],\n /**\n * Background Position\n * @see https://tailwindcss.com/docs/background-position\n */\n 'bg-position': [{\n bg: scaleBgPosition()\n }],\n /**\n * Background Repeat\n * @see https://tailwindcss.com/docs/background-repeat\n */\n 'bg-repeat': [{\n bg: scaleBgRepeat()\n }],\n /**\n * Background Size\n * @see https://tailwindcss.com/docs/background-size\n */\n 'bg-size': [{\n bg: scaleBgSize()\n }],\n /**\n * Background Image\n * @see https://tailwindcss.com/docs/background-image\n */\n 'bg-image': [{\n bg: ['none', {\n linear: [{\n to: ['t', 'tr', 'r', 'br', 'b', 'bl', 'l', 'tl']\n }, isInteger, isArbitraryVariable, isArbitraryValue],\n radial: ['', isArbitraryVariable, isArbitraryValue],\n conic: [isInteger, isArbitraryVariable, isArbitraryValue]\n }, isArbitraryVariableImage, isArbitraryImage]\n }],\n /**\n * Background Color\n * @see https://tailwindcss.com/docs/background-color\n */\n 'bg-color': [{\n bg: scaleColor()\n }],\n /**\n * Gradient Color Stops From Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from-pos': [{\n from: scaleGradientStopPosition()\n }],\n /**\n * Gradient Color Stops Via Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via-pos': [{\n via: scaleGradientStopPosition()\n }],\n /**\n * Gradient Color Stops To Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to-pos': [{\n to: scaleGradientStopPosition()\n }],\n /**\n * Gradient Color Stops From\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from': [{\n from: scaleColor()\n }],\n /**\n * Gradient Color Stops Via\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via': [{\n via: scaleColor()\n }],\n /**\n * Gradient Color Stops To\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to': [{\n to: scaleColor()\n }],\n // ---------------\n // --- Borders ---\n // ---------------\n /**\n * Border Radius\n * @see https://tailwindcss.com/docs/border-radius\n */\n rounded: [{\n rounded: scaleRadius()\n }],\n /**\n * Border Radius Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-s': [{\n 'rounded-s': scaleRadius()\n }],\n /**\n * Border Radius End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-e': [{\n 'rounded-e': scaleRadius()\n }],\n /**\n * Border Radius Top\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-t': [{\n 'rounded-t': scaleRadius()\n }],\n /**\n * Border Radius Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-r': [{\n 'rounded-r': scaleRadius()\n }],\n /**\n * Border Radius Bottom\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-b': [{\n 'rounded-b': scaleRadius()\n }],\n /**\n * Border Radius Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-l': [{\n 'rounded-l': scaleRadius()\n }],\n /**\n * Border Radius Start Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ss': [{\n 'rounded-ss': scaleRadius()\n }],\n /**\n * Border Radius Start End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-se': [{\n 'rounded-se': scaleRadius()\n }],\n /**\n * Border Radius End End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ee': [{\n 'rounded-ee': scaleRadius()\n }],\n /**\n * Border Radius End Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-es': [{\n 'rounded-es': scaleRadius()\n }],\n /**\n * Border Radius Top Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tl': [{\n 'rounded-tl': scaleRadius()\n }],\n /**\n * Border Radius Top Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tr': [{\n 'rounded-tr': scaleRadius()\n }],\n /**\n * Border Radius Bottom Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-br': [{\n 'rounded-br': scaleRadius()\n }],\n /**\n * Border Radius Bottom Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-bl': [{\n 'rounded-bl': scaleRadius()\n }],\n /**\n * Border Width\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w': [{\n border: scaleBorderWidth()\n }],\n /**\n * Border Width Inline\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-x': [{\n 'border-x': scaleBorderWidth()\n }],\n /**\n * Border Width Block\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-y': [{\n 'border-y': scaleBorderWidth()\n }],\n /**\n * Border Width Inline Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-s': [{\n 'border-s': scaleBorderWidth()\n }],\n /**\n * Border Width Inline End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-e': [{\n 'border-e': scaleBorderWidth()\n }],\n /**\n * Border Width Block Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-bs': [{\n 'border-bs': scaleBorderWidth()\n }],\n /**\n * Border Width Block End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-be': [{\n 'border-be': scaleBorderWidth()\n }],\n /**\n * Border Width Top\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-t': [{\n 'border-t': scaleBorderWidth()\n }],\n /**\n * Border Width Right\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-r': [{\n 'border-r': scaleBorderWidth()\n }],\n /**\n * Border Width Bottom\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-b': [{\n 'border-b': scaleBorderWidth()\n }],\n /**\n * Border Width Left\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-l': [{\n 'border-l': scaleBorderWidth()\n }],\n /**\n * Divide Width X\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-x': [{\n 'divide-x': scaleBorderWidth()\n }],\n /**\n * Divide Width X Reverse\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-x-reverse': ['divide-x-reverse'],\n /**\n * Divide Width Y\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-y': [{\n 'divide-y': scaleBorderWidth()\n }],\n /**\n * Divide Width Y Reverse\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-y-reverse': ['divide-y-reverse'],\n /**\n * Border Style\n * @see https://tailwindcss.com/docs/border-style\n */\n 'border-style': [{\n border: [...scaleLineStyle(), 'hidden', 'none']\n }],\n /**\n * Divide Style\n * @see https://tailwindcss.com/docs/border-style#setting-the-divider-style\n */\n 'divide-style': [{\n divide: [...scaleLineStyle(), 'hidden', 'none']\n }],\n /**\n * Border Color\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color': [{\n border: scaleColor()\n }],\n /**\n * Border Color Inline\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-x': [{\n 'border-x': scaleColor()\n }],\n /**\n * Border Color Block\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-y': [{\n 'border-y': scaleColor()\n }],\n /**\n * Border Color Inline Start\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-s': [{\n 'border-s': scaleColor()\n }],\n /**\n * Border Color Inline End\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-e': [{\n 'border-e': scaleColor()\n }],\n /**\n * Border Color Block Start\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-bs': [{\n 'border-bs': scaleColor()\n }],\n /**\n * Border Color Block End\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-be': [{\n 'border-be': scaleColor()\n }],\n /**\n * Border Color Top\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-t': [{\n 'border-t': scaleColor()\n }],\n /**\n * Border Color Right\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-r': [{\n 'border-r': scaleColor()\n }],\n /**\n * Border Color Bottom\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-b': [{\n 'border-b': scaleColor()\n }],\n /**\n * Border Color Left\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-l': [{\n 'border-l': scaleColor()\n }],\n /**\n * Divide Color\n * @see https://tailwindcss.com/docs/divide-color\n */\n 'divide-color': [{\n divide: scaleColor()\n }],\n /**\n * Outline Style\n * @see https://tailwindcss.com/docs/outline-style\n */\n 'outline-style': [{\n outline: [...scaleLineStyle(), 'none', 'hidden']\n }],\n /**\n * Outline Offset\n * @see https://tailwindcss.com/docs/outline-offset\n */\n 'outline-offset': [{\n 'outline-offset': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Outline Width\n * @see https://tailwindcss.com/docs/outline-width\n */\n 'outline-w': [{\n outline: ['', isNumber, isArbitraryVariableLength, isArbitraryLength]\n }],\n /**\n * Outline Color\n * @see https://tailwindcss.com/docs/outline-color\n */\n 'outline-color': [{\n outline: scaleColor()\n }],\n // ---------------\n // --- Effects ---\n // ---------------\n /**\n * Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow\n */\n shadow: [{\n shadow: [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', themeShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-shadow-color\n */\n 'shadow-color': [{\n shadow: scaleColor()\n }],\n /**\n * Inset Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-shadow\n */\n 'inset-shadow': [{\n 'inset-shadow': ['none', themeInsetShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Inset Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-shadow-color\n */\n 'inset-shadow-color': [{\n 'inset-shadow': scaleColor()\n }],\n /**\n * Ring Width\n * @see https://tailwindcss.com/docs/box-shadow#adding-a-ring\n */\n 'ring-w': [{\n ring: scaleBorderWidth()\n }],\n /**\n * Ring Width Inset\n * @see https://v3.tailwindcss.com/docs/ring-width#inset-rings\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-w-inset': ['ring-inset'],\n /**\n * Ring Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-ring-color\n */\n 'ring-color': [{\n ring: scaleColor()\n }],\n /**\n * Ring Offset Width\n * @see https://v3.tailwindcss.com/docs/ring-offset-width\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-offset-w': [{\n 'ring-offset': [isNumber, isArbitraryLength]\n }],\n /**\n * Ring Offset Color\n * @see https://v3.tailwindcss.com/docs/ring-offset-color\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-offset-color': [{\n 'ring-offset': scaleColor()\n }],\n /**\n * Inset Ring Width\n * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-ring\n */\n 'inset-ring-w': [{\n 'inset-ring': scaleBorderWidth()\n }],\n /**\n * Inset Ring Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-ring-color\n */\n 'inset-ring-color': [{\n 'inset-ring': scaleColor()\n }],\n /**\n * Text Shadow\n * @see https://tailwindcss.com/docs/text-shadow\n */\n 'text-shadow': [{\n 'text-shadow': ['none', themeTextShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Text Shadow Color\n * @see https://tailwindcss.com/docs/text-shadow#setting-the-shadow-color\n */\n 'text-shadow-color': [{\n 'text-shadow': scaleColor()\n }],\n /**\n * Opacity\n * @see https://tailwindcss.com/docs/opacity\n */\n opacity: [{\n opacity: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Mix Blend Mode\n * @see https://tailwindcss.com/docs/mix-blend-mode\n */\n 'mix-blend': [{\n 'mix-blend': [...scaleBlendMode(), 'plus-darker', 'plus-lighter']\n }],\n /**\n * Background Blend Mode\n * @see https://tailwindcss.com/docs/background-blend-mode\n */\n 'bg-blend': [{\n 'bg-blend': scaleBlendMode()\n }],\n /**\n * Mask Clip\n * @see https://tailwindcss.com/docs/mask-clip\n */\n 'mask-clip': [{\n 'mask-clip': ['border', 'padding', 'content', 'fill', 'stroke', 'view']\n }, 'mask-no-clip'],\n /**\n * Mask Composite\n * @see https://tailwindcss.com/docs/mask-composite\n */\n 'mask-composite': [{\n mask: ['add', 'subtract', 'intersect', 'exclude']\n }],\n /**\n * Mask Image\n * @see https://tailwindcss.com/docs/mask-image\n */\n 'mask-image-linear-pos': [{\n 'mask-linear': [isNumber]\n }],\n 'mask-image-linear-from-pos': [{\n 'mask-linear-from': scaleMaskImagePosition()\n }],\n 'mask-image-linear-to-pos': [{\n 'mask-linear-to': scaleMaskImagePosition()\n }],\n 'mask-image-linear-from-color': [{\n 'mask-linear-from': scaleColor()\n }],\n 'mask-image-linear-to-color': [{\n 'mask-linear-to': scaleColor()\n }],\n 'mask-image-t-from-pos': [{\n 'mask-t-from': scaleMaskImagePosition()\n }],\n 'mask-image-t-to-pos': [{\n 'mask-t-to': scaleMaskImagePosition()\n }],\n 'mask-image-t-from-color': [{\n 'mask-t-from': scaleColor()\n }],\n 'mask-image-t-to-color': [{\n 'mask-t-to': scaleColor()\n }],\n 'mask-image-r-from-pos': [{\n 'mask-r-from': scaleMaskImagePosition()\n }],\n 'mask-image-r-to-pos': [{\n 'mask-r-to': scaleMaskImagePosition()\n }],\n 'mask-image-r-from-color': [{\n 'mask-r-from': scaleColor()\n }],\n 'mask-image-r-to-color': [{\n 'mask-r-to': scaleColor()\n }],\n 'mask-image-b-from-pos': [{\n 'mask-b-from': scaleMaskImagePosition()\n }],\n 'mask-image-b-to-pos': [{\n 'mask-b-to': scaleMaskImagePosition()\n }],\n 'mask-image-b-from-color': [{\n 'mask-b-from': scaleColor()\n }],\n 'mask-image-b-to-color': [{\n 'mask-b-to': scaleColor()\n }],\n 'mask-image-l-from-pos': [{\n 'mask-l-from': scaleMaskImagePosition()\n }],\n 'mask-image-l-to-pos': [{\n 'mask-l-to': scaleMaskImagePosition()\n }],\n 'mask-image-l-from-color': [{\n 'mask-l-from': scaleColor()\n }],\n 'mask-image-l-to-color': [{\n 'mask-l-to': scaleColor()\n }],\n 'mask-image-x-from-pos': [{\n 'mask-x-from': scaleMaskImagePosition()\n }],\n 'mask-image-x-to-pos': [{\n 'mask-x-to': scaleMaskImagePosition()\n }],\n 'mask-image-x-from-color': [{\n 'mask-x-from': scaleColor()\n }],\n 'mask-image-x-to-color': [{\n 'mask-x-to': scaleColor()\n }],\n 'mask-image-y-from-pos': [{\n 'mask-y-from': scaleMaskImagePosition()\n }],\n 'mask-image-y-to-pos': [{\n 'mask-y-to': scaleMaskImagePosition()\n }],\n 'mask-image-y-from-color': [{\n 'mask-y-from': scaleColor()\n }],\n 'mask-image-y-to-color': [{\n 'mask-y-to': scaleColor()\n }],\n 'mask-image-radial': [{\n 'mask-radial': [isArbitraryVariable, isArbitraryValue]\n }],\n 'mask-image-radial-from-pos': [{\n 'mask-radial-from': scaleMaskImagePosition()\n }],\n 'mask-image-radial-to-pos': [{\n 'mask-radial-to': scaleMaskImagePosition()\n }],\n 'mask-image-radial-from-color': [{\n 'mask-radial-from': scaleColor()\n }],\n 'mask-image-radial-to-color': [{\n 'mask-radial-to': scaleColor()\n }],\n 'mask-image-radial-shape': [{\n 'mask-radial': ['circle', 'ellipse']\n }],\n 'mask-image-radial-size': [{\n 'mask-radial': [{\n closest: ['side', 'corner'],\n farthest: ['side', 'corner']\n }]\n }],\n 'mask-image-radial-pos': [{\n 'mask-radial-at': scalePosition()\n }],\n 'mask-image-conic-pos': [{\n 'mask-conic': [isNumber]\n }],\n 'mask-image-conic-from-pos': [{\n 'mask-conic-from': scaleMaskImagePosition()\n }],\n 'mask-image-conic-to-pos': [{\n 'mask-conic-to': scaleMaskImagePosition()\n }],\n 'mask-image-conic-from-color': [{\n 'mask-conic-from': scaleColor()\n }],\n 'mask-image-conic-to-color': [{\n 'mask-conic-to': scaleColor()\n }],\n /**\n * Mask Mode\n * @see https://tailwindcss.com/docs/mask-mode\n */\n 'mask-mode': [{\n mask: ['alpha', 'luminance', 'match']\n }],\n /**\n * Mask Origin\n * @see https://tailwindcss.com/docs/mask-origin\n */\n 'mask-origin': [{\n 'mask-origin': ['border', 'padding', 'content', 'fill', 'stroke', 'view']\n }],\n /**\n * Mask Position\n * @see https://tailwindcss.com/docs/mask-position\n */\n 'mask-position': [{\n mask: scaleBgPosition()\n }],\n /**\n * Mask Repeat\n * @see https://tailwindcss.com/docs/mask-repeat\n */\n 'mask-repeat': [{\n mask: scaleBgRepeat()\n }],\n /**\n * Mask Size\n * @see https://tailwindcss.com/docs/mask-size\n */\n 'mask-size': [{\n mask: scaleBgSize()\n }],\n /**\n * Mask Type\n * @see https://tailwindcss.com/docs/mask-type\n */\n 'mask-type': [{\n 'mask-type': ['alpha', 'luminance']\n }],\n /**\n * Mask Image\n * @see https://tailwindcss.com/docs/mask-image\n */\n 'mask-image': [{\n mask: ['none', isArbitraryVariable, isArbitraryValue]\n }],\n // ---------------\n // --- Filters ---\n // ---------------\n /**\n * Filter\n * @see https://tailwindcss.com/docs/filter\n */\n filter: [{\n filter: [\n // Deprecated since Tailwind CSS v3.0.0\n '', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Blur\n * @see https://tailwindcss.com/docs/blur\n */\n blur: [{\n blur: scaleBlur()\n }],\n /**\n * Brightness\n * @see https://tailwindcss.com/docs/brightness\n */\n brightness: [{\n brightness: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Contrast\n * @see https://tailwindcss.com/docs/contrast\n */\n contrast: [{\n contrast: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Drop Shadow\n * @see https://tailwindcss.com/docs/drop-shadow\n */\n 'drop-shadow': [{\n 'drop-shadow': [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', themeDropShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Drop Shadow Color\n * @see https://tailwindcss.com/docs/filter-drop-shadow#setting-the-shadow-color\n */\n 'drop-shadow-color': [{\n 'drop-shadow': scaleColor()\n }],\n /**\n * Grayscale\n * @see https://tailwindcss.com/docs/grayscale\n */\n grayscale: [{\n grayscale: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Hue Rotate\n * @see https://tailwindcss.com/docs/hue-rotate\n */\n 'hue-rotate': [{\n 'hue-rotate': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Invert\n * @see https://tailwindcss.com/docs/invert\n */\n invert: [{\n invert: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Saturate\n * @see https://tailwindcss.com/docs/saturate\n */\n saturate: [{\n saturate: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Sepia\n * @see https://tailwindcss.com/docs/sepia\n */\n sepia: [{\n sepia: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Filter\n * @see https://tailwindcss.com/docs/backdrop-filter\n */\n 'backdrop-filter': [{\n 'backdrop-filter': [\n // Deprecated since Tailwind CSS v3.0.0\n '', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Blur\n * @see https://tailwindcss.com/docs/backdrop-blur\n */\n 'backdrop-blur': [{\n 'backdrop-blur': scaleBlur()\n }],\n /**\n * Backdrop Brightness\n * @see https://tailwindcss.com/docs/backdrop-brightness\n */\n 'backdrop-brightness': [{\n 'backdrop-brightness': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Contrast\n * @see https://tailwindcss.com/docs/backdrop-contrast\n */\n 'backdrop-contrast': [{\n 'backdrop-contrast': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Grayscale\n * @see https://tailwindcss.com/docs/backdrop-grayscale\n */\n 'backdrop-grayscale': [{\n 'backdrop-grayscale': ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Hue Rotate\n * @see https://tailwindcss.com/docs/backdrop-hue-rotate\n */\n 'backdrop-hue-rotate': [{\n 'backdrop-hue-rotate': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Invert\n * @see https://tailwindcss.com/docs/backdrop-invert\n */\n 'backdrop-invert': [{\n 'backdrop-invert': ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Opacity\n * @see https://tailwindcss.com/docs/backdrop-opacity\n */\n 'backdrop-opacity': [{\n 'backdrop-opacity': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Saturate\n * @see https://tailwindcss.com/docs/backdrop-saturate\n */\n 'backdrop-saturate': [{\n 'backdrop-saturate': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Sepia\n * @see https://tailwindcss.com/docs/backdrop-sepia\n */\n 'backdrop-sepia': [{\n 'backdrop-sepia': ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n // --------------\n // --- Tables ---\n // --------------\n /**\n * Border Collapse\n * @see https://tailwindcss.com/docs/border-collapse\n */\n 'border-collapse': [{\n border: ['collapse', 'separate']\n }],\n /**\n * Border Spacing\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing': [{\n 'border-spacing': scaleUnambiguousSpacing()\n }],\n /**\n * Border Spacing X\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-x': [{\n 'border-spacing-x': scaleUnambiguousSpacing()\n }],\n /**\n * Border Spacing Y\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-y': [{\n 'border-spacing-y': scaleUnambiguousSpacing()\n }],\n /**\n * Table Layout\n * @see https://tailwindcss.com/docs/table-layout\n */\n 'table-layout': [{\n table: ['auto', 'fixed']\n }],\n /**\n * Caption Side\n * @see https://tailwindcss.com/docs/caption-side\n */\n caption: [{\n caption: ['top', 'bottom']\n }],\n // ---------------------------------\n // --- Transitions and Animation ---\n // ---------------------------------\n /**\n * Transition Property\n * @see https://tailwindcss.com/docs/transition-property\n */\n transition: [{\n transition: ['', 'all', 'colors', 'opacity', 'shadow', 'transform', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Transition Behavior\n * @see https://tailwindcss.com/docs/transition-behavior\n */\n 'transition-behavior': [{\n transition: ['normal', 'discrete']\n }],\n /**\n * Transition Duration\n * @see https://tailwindcss.com/docs/transition-duration\n */\n duration: [{\n duration: [isNumber, 'initial', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Transition Timing Function\n * @see https://tailwindcss.com/docs/transition-timing-function\n */\n ease: [{\n ease: ['linear', 'initial', themeEase, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Transition Delay\n * @see https://tailwindcss.com/docs/transition-delay\n */\n delay: [{\n delay: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Animation\n * @see https://tailwindcss.com/docs/animation\n */\n animate: [{\n animate: ['none', themeAnimate, isArbitraryVariable, isArbitraryValue]\n }],\n // ------------------\n // --- Transforms ---\n // ------------------\n /**\n * Backface Visibility\n * @see https://tailwindcss.com/docs/backface-visibility\n */\n backface: [{\n backface: ['hidden', 'visible']\n }],\n /**\n * Perspective\n * @see https://tailwindcss.com/docs/perspective\n */\n perspective: [{\n perspective: [themePerspective, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Perspective Origin\n * @see https://tailwindcss.com/docs/perspective-origin\n */\n 'perspective-origin': [{\n 'perspective-origin': scalePositionWithArbitrary()\n }],\n /**\n * Rotate\n * @see https://tailwindcss.com/docs/rotate\n */\n rotate: [{\n rotate: scaleRotate()\n }],\n /**\n * Rotate X\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-x': [{\n 'rotate-x': scaleRotate()\n }],\n /**\n * Rotate Y\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-y': [{\n 'rotate-y': scaleRotate()\n }],\n /**\n * Rotate Z\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-z': [{\n 'rotate-z': scaleRotate()\n }],\n /**\n * Scale\n * @see https://tailwindcss.com/docs/scale\n */\n scale: [{\n scale: scaleScale()\n }],\n /**\n * Scale X\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-x': [{\n 'scale-x': scaleScale()\n }],\n /**\n * Scale Y\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-y': [{\n 'scale-y': scaleScale()\n }],\n /**\n * Scale Z\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-z': [{\n 'scale-z': scaleScale()\n }],\n /**\n * Scale 3D\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-3d': ['scale-3d'],\n /**\n * Skew\n * @see https://tailwindcss.com/docs/skew\n */\n skew: [{\n skew: scaleSkew()\n }],\n /**\n * Skew X\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-x': [{\n 'skew-x': scaleSkew()\n }],\n /**\n * Skew Y\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-y': [{\n 'skew-y': scaleSkew()\n }],\n /**\n * Transform\n * @see https://tailwindcss.com/docs/transform\n */\n transform: [{\n transform: [isArbitraryVariable, isArbitraryValue, '', 'none', 'gpu', 'cpu']\n }],\n /**\n * Transform Origin\n * @see https://tailwindcss.com/docs/transform-origin\n */\n 'transform-origin': [{\n origin: scalePositionWithArbitrary()\n }],\n /**\n * Transform Style\n * @see https://tailwindcss.com/docs/transform-style\n */\n 'transform-style': [{\n transform: ['3d', 'flat']\n }],\n /**\n * Translate\n * @see https://tailwindcss.com/docs/translate\n */\n translate: [{\n translate: scaleTranslate()\n }],\n /**\n * Translate X\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-x': [{\n 'translate-x': scaleTranslate()\n }],\n /**\n * Translate Y\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-y': [{\n 'translate-y': scaleTranslate()\n }],\n /**\n * Translate Z\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-z': [{\n 'translate-z': scaleTranslate()\n }],\n /**\n * Translate None\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-none': ['translate-none'],\n /**\n * Zoom\n * @see https://tailwindcss.com/docs/zoom\n */\n zoom: [{\n zoom: [isInteger, isArbitraryVariable, isArbitraryValue]\n }],\n // ---------------------\n // --- Interactivity ---\n // ---------------------\n /**\n * Accent Color\n * @see https://tailwindcss.com/docs/accent-color\n */\n accent: [{\n accent: scaleColor()\n }],\n /**\n * Appearance\n * @see https://tailwindcss.com/docs/appearance\n */\n appearance: [{\n appearance: ['none', 'auto']\n }],\n /**\n * Caret Color\n * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities\n */\n 'caret-color': [{\n caret: scaleColor()\n }],\n /**\n * Color Scheme\n * @see https://tailwindcss.com/docs/color-scheme\n */\n 'color-scheme': [{\n scheme: ['normal', 'dark', 'light', 'light-dark', 'only-dark', 'only-light']\n }],\n /**\n * Cursor\n * @see https://tailwindcss.com/docs/cursor\n */\n cursor: [{\n cursor: ['auto', 'default', 'pointer', 'wait', 'text', 'move', 'help', 'not-allowed', 'none', 'context-menu', 'progress', 'cell', 'crosshair', 'vertical-text', 'alias', 'copy', 'no-drop', 'grab', 'grabbing', 'all-scroll', 'col-resize', 'row-resize', 'n-resize', 'e-resize', 's-resize', 'w-resize', 'ne-resize', 'nw-resize', 'se-resize', 'sw-resize', 'ew-resize', 'ns-resize', 'nesw-resize', 'nwse-resize', 'zoom-in', 'zoom-out', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Field Sizing\n * @see https://tailwindcss.com/docs/field-sizing\n */\n 'field-sizing': [{\n 'field-sizing': ['fixed', 'content']\n }],\n /**\n * Pointer Events\n * @see https://tailwindcss.com/docs/pointer-events\n */\n 'pointer-events': [{\n 'pointer-events': ['auto', 'none']\n }],\n /**\n * Resize\n * @see https://tailwindcss.com/docs/resize\n */\n resize: [{\n resize: ['none', '', 'y', 'x']\n }],\n /**\n * Scroll Behavior\n * @see https://tailwindcss.com/docs/scroll-behavior\n */\n 'scroll-behavior': [{\n scroll: ['auto', 'smooth']\n }],\n /**\n * Scrollbar Thumb Color\n * @see https://tailwindcss.com/docs/scrollbar-color\n */\n 'scrollbar-thumb-color': [{\n 'scrollbar-thumb': scaleColor()\n }],\n /**\n * Scrollbar Track Color\n * @see https://tailwindcss.com/docs/scrollbar-color\n */\n 'scrollbar-track-color': [{\n 'scrollbar-track': scaleColor()\n }],\n /**\n * Scrollbar Gutter\n * @see https://tailwindcss.com/docs/scrollbar-gutter\n */\n 'scrollbar-gutter': [{\n 'scrollbar-gutter': ['auto', 'stable', 'both']\n }],\n /**\n * Scrollbar Width\n * @see https://tailwindcss.com/docs/scrollbar-width\n */\n 'scrollbar-w': [{\n scrollbar: ['auto', 'thin', 'none']\n }],\n /**\n * Scroll Margin\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-m': [{\n 'scroll-m': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Inline\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mx': [{\n 'scroll-mx': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Block\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-my': [{\n 'scroll-my': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Inline Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ms': [{\n 'scroll-ms': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Inline End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-me': [{\n 'scroll-me': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Block Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mbs': [{\n 'scroll-mbs': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Block End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mbe': [{\n 'scroll-mbe': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Top\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mt': [{\n 'scroll-mt': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Right\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mr': [{\n 'scroll-mr': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Bottom\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mb': [{\n 'scroll-mb': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Left\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ml': [{\n 'scroll-ml': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-p': [{\n 'scroll-p': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Inline\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-px': [{\n 'scroll-px': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Block\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-py': [{\n 'scroll-py': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Inline Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-ps': [{\n 'scroll-ps': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Inline End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pe': [{\n 'scroll-pe': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Block Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pbs': [{\n 'scroll-pbs': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Block End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pbe': [{\n 'scroll-pbe': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Top\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pt': [{\n 'scroll-pt': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Right\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pr': [{\n 'scroll-pr': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Bottom\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pb': [{\n 'scroll-pb': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Left\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pl': [{\n 'scroll-pl': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Snap Align\n * @see https://tailwindcss.com/docs/scroll-snap-align\n */\n 'snap-align': [{\n snap: ['start', 'end', 'center', 'align-none']\n }],\n /**\n * Scroll Snap Stop\n * @see https://tailwindcss.com/docs/scroll-snap-stop\n */\n 'snap-stop': [{\n snap: ['normal', 'always']\n }],\n /**\n * Scroll Snap Type\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-type': [{\n snap: ['none', 'x', 'y', 'both']\n }],\n /**\n * Scroll Snap Type Strictness\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-strictness': [{\n snap: ['mandatory', 'proximity']\n }],\n /**\n * Touch Action\n * @see https://tailwindcss.com/docs/touch-action\n */\n touch: [{\n touch: ['auto', 'none', 'manipulation']\n }],\n /**\n * Touch Action X\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-x': [{\n 'touch-pan': ['x', 'left', 'right']\n }],\n /**\n * Touch Action Y\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-y': [{\n 'touch-pan': ['y', 'up', 'down']\n }],\n /**\n * Touch Action Pinch Zoom\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-pz': ['touch-pinch-zoom'],\n /**\n * User Select\n * @see https://tailwindcss.com/docs/user-select\n */\n select: [{\n select: ['none', 'text', 'all', 'auto']\n }],\n /**\n * Will Change\n * @see https://tailwindcss.com/docs/will-change\n */\n 'will-change': [{\n 'will-change': ['auto', 'scroll', 'contents', 'transform', isArbitraryVariable, isArbitraryValue]\n }],\n // -----------\n // --- SVG ---\n // -----------\n /**\n * Fill\n * @see https://tailwindcss.com/docs/fill\n */\n fill: [{\n fill: ['none', ...scaleColor()]\n }],\n /**\n * Stroke Width\n * @see https://tailwindcss.com/docs/stroke-width\n */\n 'stroke-w': [{\n stroke: [isNumber, isArbitraryVariableLength, isArbitraryLength, isArbitraryNumber]\n }],\n /**\n * Stroke\n * @see https://tailwindcss.com/docs/stroke\n */\n stroke: [{\n stroke: ['none', ...scaleColor()]\n }],\n // ---------------------\n // --- Accessibility ---\n // ---------------------\n /**\n * Forced Color Adjust\n * @see https://tailwindcss.com/docs/forced-color-adjust\n */\n 'forced-color-adjust': [{\n 'forced-color-adjust': ['auto', 'none']\n }]\n },\n conflictingClassGroups: {\n 'container-named': ['container-type'],\n overflow: ['overflow-x', 'overflow-y'],\n overscroll: ['overscroll-x', 'overscroll-y'],\n inset: ['inset-x', 'inset-y', 'inset-bs', 'inset-be', 'start', 'end', 'top', 'right', 'bottom', 'left'],\n 'inset-x': ['right', 'left'],\n 'inset-y': ['top', 'bottom'],\n flex: ['basis', 'grow', 'shrink'],\n gap: ['gap-x', 'gap-y'],\n p: ['px', 'py', 'ps', 'pe', 'pbs', 'pbe', 'pt', 'pr', 'pb', 'pl'],\n px: ['pr', 'pl'],\n py: ['pt', 'pb'],\n m: ['mx', 'my', 'ms', 'me', 'mbs', 'mbe', 'mt', 'mr', 'mb', 'ml'],\n mx: ['mr', 'ml'],\n my: ['mt', 'mb'],\n size: ['w', 'h'],\n 'font-size': ['leading'],\n 'fvn-normal': ['fvn-ordinal', 'fvn-slashed-zero', 'fvn-figure', 'fvn-spacing', 'fvn-fraction'],\n 'fvn-ordinal': ['fvn-normal'],\n 'fvn-slashed-zero': ['fvn-normal'],\n 'fvn-figure': ['fvn-normal'],\n 'fvn-spacing': ['fvn-normal'],\n 'fvn-fraction': ['fvn-normal'],\n 'line-clamp': ['display', 'overflow'],\n rounded: ['rounded-s', 'rounded-e', 'rounded-t', 'rounded-r', 'rounded-b', 'rounded-l', 'rounded-ss', 'rounded-se', 'rounded-ee', 'rounded-es', 'rounded-tl', 'rounded-tr', 'rounded-br', 'rounded-bl'],\n 'rounded-s': ['rounded-ss', 'rounded-es'],\n 'rounded-e': ['rounded-se', 'rounded-ee'],\n 'rounded-t': ['rounded-tl', 'rounded-tr'],\n 'rounded-r': ['rounded-tr', 'rounded-br'],\n 'rounded-b': ['rounded-br', 'rounded-bl'],\n 'rounded-l': ['rounded-tl', 'rounded-bl'],\n 'border-spacing': ['border-spacing-x', 'border-spacing-y'],\n 'border-w': ['border-w-x', 'border-w-y', 'border-w-s', 'border-w-e', 'border-w-bs', 'border-w-be', 'border-w-t', 'border-w-r', 'border-w-b', 'border-w-l'],\n 'border-w-x': ['border-w-r', 'border-w-l'],\n 'border-w-y': ['border-w-t', 'border-w-b'],\n 'border-color': ['border-color-x', 'border-color-y', 'border-color-s', 'border-color-e', 'border-color-bs', 'border-color-be', 'border-color-t', 'border-color-r', 'border-color-b', 'border-color-l'],\n 'border-color-x': ['border-color-r', 'border-color-l'],\n 'border-color-y': ['border-color-t', 'border-color-b'],\n translate: ['translate-x', 'translate-y', 'translate-none'],\n 'translate-none': ['translate', 'translate-x', 'translate-y', 'translate-z'],\n 'scroll-m': ['scroll-mx', 'scroll-my', 'scroll-ms', 'scroll-me', 'scroll-mbs', 'scroll-mbe', 'scroll-mt', 'scroll-mr', 'scroll-mb', 'scroll-ml'],\n 'scroll-mx': ['scroll-mr', 'scroll-ml'],\n 'scroll-my': ['scroll-mt', 'scroll-mb'],\n 'scroll-p': ['scroll-px', 'scroll-py', 'scroll-ps', 'scroll-pe', 'scroll-pbs', 'scroll-pbe', 'scroll-pt', 'scroll-pr', 'scroll-pb', 'scroll-pl'],\n 'scroll-px': ['scroll-pr', 'scroll-pl'],\n 'scroll-py': ['scroll-pt', 'scroll-pb'],\n touch: ['touch-x', 'touch-y', 'touch-pz'],\n 'touch-x': ['touch'],\n 'touch-y': ['touch'],\n 'touch-pz': ['touch']\n },\n conflictingClassGroupModifiers: {\n 'font-size': ['leading']\n },\n postfixLookupClassGroups: ['container-type'],\n orderSensitiveModifiers: ['*', '**', 'after', 'backdrop', 'before', 'details-content', 'file', 'first-letter', 'first-line', 'marker', 'placeholder', 'selection']\n };\n};\n\n/**\n * @param baseConfig Config where other config will be merged into. This object will be mutated.\n * @param configExtension Partial config to merge into the `baseConfig`.\n */\nconst mergeConfigs = (baseConfig, {\n cacheSize,\n prefix,\n experimentalParseClassName,\n extend = {},\n override = {}\n}) => {\n overrideProperty(baseConfig, 'cacheSize', cacheSize);\n overrideProperty(baseConfig, 'prefix', prefix);\n overrideProperty(baseConfig, 'experimentalParseClassName', experimentalParseClassName);\n overrideConfigProperties(baseConfig.theme, override.theme);\n overrideConfigProperties(baseConfig.classGroups, override.classGroups);\n overrideConfigProperties(baseConfig.conflictingClassGroups, override.conflictingClassGroups);\n overrideConfigProperties(baseConfig.conflictingClassGroupModifiers, override.conflictingClassGroupModifiers);\n overrideProperty(baseConfig, 'postfixLookupClassGroups', override.postfixLookupClassGroups);\n overrideProperty(baseConfig, 'orderSensitiveModifiers', override.orderSensitiveModifiers);\n mergeConfigProperties(baseConfig.theme, extend.theme);\n mergeConfigProperties(baseConfig.classGroups, extend.classGroups);\n mergeConfigProperties(baseConfig.conflictingClassGroups, extend.conflictingClassGroups);\n mergeConfigProperties(baseConfig.conflictingClassGroupModifiers, extend.conflictingClassGroupModifiers);\n mergeArrayProperties(baseConfig, extend, 'postfixLookupClassGroups');\n mergeArrayProperties(baseConfig, extend, 'orderSensitiveModifiers');\n return baseConfig;\n};\nconst overrideProperty = (baseObject, overrideKey, overrideValue) => {\n if (overrideValue !== undefined) {\n baseObject[overrideKey] = overrideValue;\n }\n};\nconst overrideConfigProperties = (baseObject, overrideObject) => {\n if (overrideObject) {\n for (const key in overrideObject) {\n overrideProperty(baseObject, key, overrideObject[key]);\n }\n }\n};\nconst mergeConfigProperties = (baseObject, mergeObject) => {\n if (mergeObject) {\n for (const key in mergeObject) {\n mergeArrayProperties(baseObject, mergeObject, key);\n }\n }\n};\nconst mergeArrayProperties = (baseObject, mergeObject, key) => {\n const mergeValue = mergeObject[key];\n if (mergeValue !== undefined) {\n baseObject[key] = baseObject[key] ? baseObject[key].concat(mergeValue) : mergeValue;\n }\n};\nconst extendTailwindMerge = (configExtension, ...createConfig) => typeof configExtension === 'function' ? createTailwindMerge(getDefaultConfig, configExtension, ...createConfig) : createTailwindMerge(() => mergeConfigs(getDefaultConfig(), configExtension), ...createConfig);\nconst twMerge = /*#__PURE__*/createTailwindMerge(getDefaultConfig);\nexport { createTailwindMerge, extendTailwindMerge, fromTheme, getDefaultConfig, mergeConfigs, twJoin, twMerge, validators };\n//# sourceMappingURL=bundle-mjs.mjs.map\n","import { clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n//#region src/cn.ts\nfunction cn(...inputs) {\n\treturn twMerge(clsx(inputs));\n}\n//#endregion\n//#region src/sizes.ts\nconst SIZES = [\n\t\"xs\",\n\t\"sm\",\n\t\"md\",\n\t\"lg\",\n\t\"xl\"\n];\nconst DEFAULT_SIZE = \"md\";\n/** Tailwind height utility per size. md uses an arbitrary value because 43px isn't on the spacing scale. */\nconst controlHeight = {\n\txs: \"h-7\",\n\tsm: \"h-9\",\n\tmd: \"h-[43px]\",\n\tlg: \"h-[52px]\",\n\txl: \"h-[60px]\"\n};\nconst controlPaddingX = {\n\txs: \"px-2\",\n\tsm: \"px-2.5\",\n\tmd: \"px-3\",\n\tlg: \"px-3.5\",\n\txl: \"px-4\"\n};\nconst controlTextSize = {\n\txs: \"text-xs\",\n\tsm: \"text-sm\",\n\tmd: \"text-sm\",\n\tlg: \"text-base\",\n\txl: \"text-base\"\n};\n/** Pixel values exposed so non-template code (icons, ResizeObserver, etc.) can read the height. */\nconst controlHeightPx = {\n\txs: 28,\n\tsm: 36,\n\tmd: 43,\n\tlg: 52,\n\txl: 60\n};\n//#endregion\nexport { DEFAULT_SIZE, SIZES, cn, controlHeight, controlHeightPx, controlPaddingX, controlTextSize };\n\n//# sourceMappingURL=index.js.map","import {\n Comment,\n Fragment,\n Text,\n cloneVNode,\n h,\n type VNode,\n type VNodeArrayChildren,\n type VNodeChild,\n} from 'vue';\n\n/**\n * Atomic tags — rendered as a single shimmer block. Their internal rendering\n * is opaque to vnode walking (no meaningful child structure for us to mirror).\n * Their own `class` + `style` are preserved so Tailwind utilities like\n * `size-16` and `rounded-full` still drive the dimensions.\n *\n * Note: `button`, `a`, `label` are deliberately NOT atomic — they're treated\n * as containers so their real `background-color` / `border` / shadow survive\n * (we add `.a-skel-block` to atomics, which paints a skeleton gradient that\n * would override Tailwind's `bg-emerald-600` and friends). Their text content\n * is recursed and replaced with a shimmer span inside the real button shape.\n */\nconst ATOMIC_TAGS = new Set([\n 'img',\n 'svg',\n 'canvas',\n 'video',\n 'audio',\n 'input',\n 'textarea',\n 'select',\n 'progress',\n 'meter',\n 'hr',\n 'iframe',\n 'object',\n 'embed',\n 'picture',\n]);\n\n/**\n * SVG child tags that should never be walked by the structural skeleton —\n * SVG interior elements use a different coordinate space (`x`/`y` are\n * attributes, not CSS), so emitting `.a-skel-block` divs at their tag would\n * yield non-rendering elements. When we see one of these, the parent `<svg>`\n * has already been treated as an atomic block — we just return null/skip.\n */\nconst SVG_INTERIOR_TAGS = new Set([\n 'circle',\n 'rect',\n 'path',\n 'line',\n 'polyline',\n 'polygon',\n 'ellipse',\n 'g',\n 'defs',\n 'clippath',\n 'mask',\n 'pattern',\n 'lineargradient',\n 'radialgradient',\n 'stop',\n 'use',\n 'symbol',\n 'foreignobject',\n 'text',\n 'tspan',\n 'textpath',\n 'marker',\n 'filter',\n 'feblend',\n 'fecolormatrix',\n 'fegaussianblur',\n 'feoffset',\n 'fedropshadow',\n 'femerge',\n 'femergenode',\n]);\n\n/**\n * Table-structural tags — preserve them as-is. Their semantics (`display:\n * table-*`) are critical for layout, and replacing them with `<div>` would\n * break the grid. Children are recursed normally.\n */\nconst TABLE_TAGS = new Set([\n 'table',\n 'thead',\n 'tbody',\n 'tfoot',\n 'tr',\n 'td',\n 'th',\n 'caption',\n 'colgroup',\n 'col',\n]);\n\n/**\n * List-structural tags — `<ul>`, `<ol>`, `<li>`, `<dl>`, `<dt>`, `<dd>`.\n * Preserved as containers; `<li>` recurses into its text/children so each\n * list item gets the right shimmer treatment.\n */\nconst LIST_TAGS = new Set(['ul', 'ol', 'li', 'dl', 'dt', 'dd']);\n\n/**\n * Tags whose content is conventionally text. When the author writes\n * `<h3>{{ data?.name }}</h3>` and `data` is null during loading, the\n * interpolation produces no children — the walker would otherwise emit an\n * empty `<h3></h3>` and no skeleton bar shows. For these tags we emit a\n * synthetic placeholder text-content span so the bar renders at the tag's\n * natural rendered width (Tailwind sizing on the tag still drives height).\n */\nconst TEXT_OWNER_TAGS = new Set([\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'p',\n 'span',\n 'a',\n 'em',\n 'strong',\n 'small',\n 'code',\n 'b',\n 'i',\n 'mark',\n 'label',\n 'caption',\n 'time',\n 'dt',\n 'dd',\n 'li',\n 'th',\n 'td',\n 'figcaption',\n 'blockquote',\n 'cite',\n 'q',\n]);\n\n/**\n * Non-breaking-space placeholder for empty text-owners. ~24 chars wide is\n * enough to read as \"a line of text\" in most fonts while still being short\n * enough that the rendered bar doesn't wrap in narrow containers.\n */\nconst TEXT_PLACEHOLDER = ' '.repeat(24);\n\nexport interface BuildOptions {\n /** Animation class applied to every emitted shimmer surface. `null` disables animation. */\n animationClass: string | null;\n /** Max recursion depth — guards runaway templates. Default 16. */\n maxDepth?: number;\n /**\n * Hard cap on emitted skeleton nodes. Default 600. The walk stops emitting\n * past this cap; the partial tree is still valid (it just won't include the\n * leaves beyond the budget).\n */\n maxNodes?: number;\n}\n\nconst DEFAULT_MAX_DEPTH = 16;\nconst DEFAULT_MAX_NODES = 600;\n\ninterface WalkState {\n emitted: number;\n cap: number;\n}\n\n/**\n * Walk a slot's vnode tree and produce a **DOM-mirror skeleton**: every element\n * is preserved (same tag, same `class`, same inline `style`), and only the\n * content is replaced. The output is structurally identical to what the real\n * component would render — Tailwind utilities for layout, spacing, sizing,\n * backgrounds and shadows all carry through. The CSS does the work of making\n * it *look* like a skeleton.\n *\n * Replacement rules:\n * - **Raw text** (e.g. interpolations, static strings) is wrapped in\n * `<span class=\"a-skel-text-content\">…the real text…</span>`. The text is\n * kept as the span's children so the inline layout reserves its real\n * rendered width — but the glyphs are painted transparent and a skeleton\n * gradient is painted in their place. Multi-line text wraps naturally,\n * producing one shimmer rect per visual line at the exact rendered position.\n * - **Atomic / interactive tags** (`img`, `svg`, `button`, `input`, …) are\n * replaced by a `<div class=\"a-skel-block\">` carrying the original element's\n * `class` and `style`, so dimensions and shapes (size, border-radius, etc.)\n * still drive the layout.\n * - **Container elements** (`div`, `section`, `h1`, `p`, `a`, `span`, …) are\n * preserved as the same tag with the same `class` and `style`; we recurse\n * into their children.\n * - **Component vnodes** can't be introspected at render time, so we emit a\n * single `<div class=\"a-skel-block\">` carrying their outer `class` / `style`.\n */\nexport function buildStructuralSkeleton(\n vnodes: VNodeChild | VNodeArrayChildren | undefined | null,\n opts: BuildOptions\n): VNode[] {\n const maxDepth = opts.maxDepth ?? DEFAULT_MAX_DEPTH;\n const state: WalkState = { emitted: 0, cap: opts.maxNodes ?? DEFAULT_MAX_NODES };\n const out: VNode[] = [];\n walk(vnodes, opts, 0, maxDepth, state, out);\n return out;\n}\n\nfunction walk(\n input: VNodeChild | VNodeArrayChildren | undefined | null,\n opts: BuildOptions,\n depth: number,\n max: number,\n state: WalkState,\n out: VNode[]\n): void {\n if (state.emitted >= state.cap) return;\n if (input == null || typeof input === 'boolean') return;\n\n if (Array.isArray(input)) {\n for (let i = 0; i < input.length; i++) {\n if (state.emitted >= state.cap) return;\n walk(input[i] as VNodeChild, opts, depth, max, state, out);\n }\n return;\n }\n\n /* Bare string / number content from interpolations. Wrap in the text-content\n * span so the real text drives the rendered width. */\n if (typeof input === 'string' || typeof input === 'number') {\n const str = String(input);\n if (str.trim()) push(out, textContentSpan(str, opts.animationClass), state);\n return;\n }\n\n const v = input as VNode;\n const type = v.type;\n\n if (type === Comment) return;\n\n if (type === Text) {\n const text = typeof v.children === 'string' ? v.children : '';\n if (text.trim()) push(out, textContentSpan(text, opts.animationClass), state);\n return;\n }\n\n if (type === Fragment) {\n walk(v.children as VNodeArrayChildren, opts, depth, max, state, out);\n return;\n }\n\n if (typeof type === 'string') {\n const tag = type.toLowerCase();\n\n /* SVG interior — bail out. The parent <svg> is treated atomically; its\n * children use a non-CSS coordinate space and shouldn't be transformed. */\n if (SVG_INTERIOR_TAGS.has(tag)) return;\n\n /* Author opt-outs — applied BEFORE the tag-based dispatch so they win.\n * Five attributes supported:\n * data-skeleton-ignore — render verbatim (chrome).\n * data-skeleton-stop — single block, no recursion.\n * data-skeleton-text — force inline text-bar treatment.\n * data-skeleton-block — force atomic shimmer-block treatment.\n * data-skeleton-variant — render the named variant primitive. */\n const props = v.props ?? {};\n if (props['data-skeleton-ignore'] !== undefined) {\n push(out, cloneVNode(v), state);\n return;\n }\n if (props['data-skeleton-stop'] !== undefined) {\n push(\n out,\n h('div', {\n class: ['a-skel-block', v.props?.class, opts.animationClass],\n style: v.props?.style as Record<string, string>,\n 'aria-hidden': 'true',\n }),\n state\n );\n return;\n }\n if (props['data-skeleton-text'] !== undefined) {\n /* Force this leaf into text-bar treatment regardless of its tag. */\n push(out, textContentSpan(' ', opts.animationClass), state);\n return;\n }\n if (props['data-skeleton-block'] !== undefined) {\n push(\n out,\n h('div', {\n class: ['a-skel-block', v.props?.class, opts.animationClass],\n style: v.props?.style as Record<string, string>,\n 'aria-hidden': 'true',\n }),\n state\n );\n return;\n }\n push(out, transformElement(v, tag, opts, depth, max, state), state);\n return;\n }\n\n /* Component vnode — we can't introspect its template, so render an opaque\n * shimmer block carrying any outer class / style the user attached. */\n if (typeof type === 'object' || typeof type === 'function') {\n push(\n out,\n h('div', {\n class: ['a-skel-block', v.props?.class, opts.animationClass],\n style: v.props?.style as Record<string, string>,\n 'aria-hidden': 'true',\n }),\n state\n );\n }\n}\n\nfunction push(out: VNode[], vn: VNode, state: WalkState): void {\n if (state.emitted >= state.cap) return;\n out.push(vn);\n state.emitted++;\n}\n\n/**\n * Surface-bearing tags — when these are encountered without their own explicit\n * background, the skeleton paints the default fill so they still read as a\n * solid element (a button without `bg-*` shouldn't look invisible).\n *\n * Pure layout containers (`div`, `section`, `main`, `article`, `header`,\n * `footer`, `nav`, `aside`) deliberately don't get the fallback — they're\n * transparent in the real DOM and should stay that way in the skeleton.\n */\nconst SURFACE_TAGS = new Set(['button', 'a', 'label', 'summary', 'fieldset', 'legend']);\n\nfunction transformElement(\n v: VNode,\n tag: string,\n opts: BuildOptions,\n depth: number,\n max: number,\n state: WalkState\n): VNode {\n const cls = v.props?.class;\n const styl = v.props?.style as Record<string, string> | string | undefined;\n\n /* Atomic / interactive — replace with a sized shimmer block. The original\n * element's class + style carry the dimensions, border-radius, etc., so a\n * `class=\"size-16 rounded-full\"` <img> becomes a 64×64 round shimmer block.\n *\n * For elements sized via HTML attributes (`<svg width=\"408\" height=\"419\">`,\n * `<img width=\"…\">`, etc.), we copy those attributes into an inline style\n * so the replacement div takes the same dimensions — without this, a div\n * doesn't honour those attributes and would render at 0×0. */\n if (ATOMIC_TAGS.has(tag)) {\n const dimStyle = atomicDimensionStyle(v.props);\n return h('div', {\n class: ['a-skel-block', cls, opts.animationClass],\n style: dimStyle ? mergeStyle(dimStyle, styl) : styl,\n 'aria-hidden': 'true',\n });\n }\n\n /* Table-structural tags — preserve them as-is. Replacing a <td> with a\n * <div> would break `display: table-*` layout. Children are recursed\n * normally so each cell gets the right shimmer treatment. */\n if (TABLE_TAGS.has(tag)) {\n if (depth >= max) {\n return h(tag, { class: cls, style: styl });\n }\n const recursed: VNode[] = [];\n walk(v.children as VNodeArrayChildren, opts, depth + 1, max, state, recursed);\n if (recursed.length === 0 && TEXT_OWNER_TAGS.has(tag)) {\n return h(tag, { class: cls, style: styl }, [\n textContentSpan(TEXT_PLACEHOLDER, opts.animationClass),\n ]);\n }\n return h(tag, { class: cls, style: styl }, recursed.length > 0 ? recursed : undefined);\n }\n\n /* List-structural tags — preserve `<ul>` / `<ol>` / `<li>` / `<dl>` etc.\n * `<li>` recurses into its content so each item gets the right shimmer\n * treatment (text bar for text-only items, mixed content for richer ones). */\n if (LIST_TAGS.has(tag)) {\n if (depth >= max) {\n return h(tag, { class: cls, style: styl });\n }\n const recursed: VNode[] = [];\n walk(v.children as VNodeArrayChildren, opts, depth + 1, max, state, recursed);\n if (recursed.length === 0 && TEXT_OWNER_TAGS.has(tag)) {\n return h(tag, { class: cls, style: styl }, [\n textContentSpan(TEXT_PLACEHOLDER, opts.animationClass),\n ]);\n }\n return h(tag, { class: cls, style: styl }, recursed.length > 0 ? recursed : undefined);\n }\n\n /* Depth cap — collapse the subtree into a single shimmer block carrying the\n * container's outer dimensions / classes. */\n if (depth >= max) {\n return h('div', {\n class: ['a-skel-block', cls, opts.animationClass],\n style: styl,\n 'aria-hidden': 'true',\n });\n }\n\n const recursed: VNode[] = [];\n walk(v.children as VNodeArrayChildren, opts, depth + 1, max, state, recursed);\n\n /* Empty text-owner — author wrote `<h3>{{ data?.name }}</h3>` and `data`\n * is null during loading, so the interpolation produced no children.\n * Inject a placeholder text-content span so a shimmer bar still renders at\n * the tag's natural rendered width (tag's `class` drives font / line-height\n * / size — same path the real text would take). */\n if (recursed.length === 0 && TEXT_OWNER_TAGS.has(tag)) {\n return h(tag, { class: cls, style: styl }, [\n textContentSpan(TEXT_PLACEHOLDER, opts.animationClass),\n ]);\n }\n\n /* Empty container — preserve the element so layout still reserves space.\n * (Spacer divs, decorative wrappers, etc.) */\n if (recursed.length === 0) {\n return h(tag, { class: cls, style: styl });\n }\n\n /* Surface-bearing element (button, a, label, …) — if the author didn't supply\n * a background, fall back to the default skeleton fill so the element stays\n * visible as a card / button / chip. Explicit `bg-*` classes or inline\n * `background` keep the real surface. */\n if (SURFACE_TAGS.has(tag) && !hasExplicitBackground(cls, styl)) {\n return h(\n tag,\n {\n class: ['a-skel-block', cls, opts.animationClass],\n style: styl,\n },\n recursed\n );\n }\n\n return cloneTag(tag, cls, styl, recursed);\n}\n\n/**\n * Extract width/height from HTML attributes that affect layout (`<svg\n * width=\"408\">`, `<img width=\"…\" height=\"…\">`) and project them into inline\n * style. Without this, replacing an attribute-sized atomic element with a\n * `<div>` would drop the size — divs don't honour those attributes.\n */\nfunction atomicDimensionStyle(\n props: Record<string, unknown> | null | undefined\n): Record<string, string> | null {\n if (!props) return null;\n const out: Record<string, string> = {};\n const w = props.width;\n const h = props.height;\n if (w !== undefined && w !== null && w !== '') {\n out.width = typeof w === 'number' ? `${w}px` : /^\\d+$/.test(String(w)) ? `${w}px` : String(w);\n }\n if (h !== undefined && h !== null && h !== '') {\n out.height = typeof h === 'number' ? `${h}px` : /^\\d+$/.test(String(h)) ? `${h}px` : String(h);\n }\n return Object.keys(out).length > 0 ? out : null;\n}\n\n/**\n * Detect whether the element has an explicit background — either via a\n * Tailwind / DaisyUI / CSS-modules `bg-*` class or via an inline\n * `background` / `background-color` / `background-image` style. When false,\n * surface-bearing elements (button, a, label, …) fall back to the default\n * skeleton fill so they don't render as a transparent gap during loading.\n */\nfunction hasExplicitBackground(cls: unknown, styl: unknown): boolean {\n if (hasBackgroundInStyle(styl)) return true;\n if (hasBackgroundInClass(cls)) return true;\n return false;\n}\n\nconst BG_CLASS_RE = /(?:^|\\s|:)bg-(?!skel)(?:\\[|[a-z])/i;\n\nfunction hasBackgroundInClass(cls: unknown): boolean {\n if (cls == null || cls === false) return false;\n if (typeof cls === 'string') return BG_CLASS_RE.test(cls);\n if (Array.isArray(cls)) {\n for (const item of cls) {\n if (hasBackgroundInClass(item)) return true;\n }\n return false;\n }\n if (typeof cls === 'object') {\n for (const k of Object.keys(cls as Record<string, unknown>)) {\n if ((cls as Record<string, unknown>)[k] && BG_CLASS_RE.test(k)) return true;\n }\n }\n return false;\n}\n\nfunction hasBackgroundInStyle(styl: unknown): boolean {\n if (!styl) return false;\n if (typeof styl === 'string') return /background(?:-color|-image)?\\s*:/i.test(styl);\n if (typeof styl === 'object') {\n const s = styl as Record<string, unknown>;\n return (\n 'background' in s ||\n 'backgroundColor' in s ||\n 'backgroundImage' in s ||\n 'background-color' in s ||\n 'background-image' in s\n );\n }\n return false;\n}\n\nfunction mergeStyle(\n a: Record<string, string>,\n b: Record<string, string> | string | undefined | null\n): Record<string, string> | string {\n if (!b) return a;\n if (typeof b === 'string') {\n /* Preserve user's inline style; prepend dim style so user values still win\n * if they explicitly set the same property. */\n const dimsStr = Object.entries(a)\n .map(([k, v]) => `${k}: ${v}`)\n .join('; ');\n return `${dimsStr}; ${b}`;\n }\n return { ...a, ...(b as Record<string, string>) };\n}\n\nfunction cloneTag(\n tag: string,\n cls: unknown,\n styl: Record<string, string> | string | undefined,\n children: VNode[]\n): VNode {\n /* We deliberately don't forward arbitrary props (`v.props`) — preserving\n * the tag + class + style is enough for visual fidelity, and dropping the\n * rest (onClick handlers, href, etc.) keeps the skeleton non-interactive. */\n return h(tag, { class: cls, style: styl }, children);\n}\n\nfunction textContentSpan(text: string, animationClass: string | null): VNode {\n return h(\n 'span',\n {\n class: ['a-skel-text-content', animationClass],\n 'aria-hidden': 'true',\n },\n text\n );\n}\n\n/* Re-export for advanced consumers who want to construct skeleton vnodes\n * themselves (e.g. inside a render function component). */\nexport { cloneVNode };\n","import { defineComponent, type PropType, type VNode, type VNodeArrayChildren } from 'vue';\nimport { buildStructuralSkeleton } from '../utils/buildStructuralSkeleton';\n\n/**\n * Renders a structural skeleton derived from a slot's vnode tree. Pure render\n * function — no template, no scoped styles — so the parent's class strings\n * pass through unchanged and Tailwind utilities continue to drive layout.\n *\n * `maxNodes` is forwarded to the walker; cap defaults to 300 (see\n * `buildStructuralSkeleton`). Beyond that the walk stops emitting and the cap\n * propagates back as a clipped tree, keeping first-paint bounded.\n */\nexport const StructuralSkeleton = defineComponent({\n name: 'StructuralSkeleton',\n props: {\n vnodes: {\n type: Array as unknown as PropType<VNodeArrayChildren>,\n required: true,\n },\n animation: {\n type: String as PropType<string | null>,\n default: null,\n },\n maxDepth: {\n type: Number,\n default: 8,\n },\n maxNodes: {\n type: Number,\n default: 300,\n },\n },\n setup(props) {\n return (): VNode[] =>\n buildStructuralSkeleton(props.vnodes, {\n animationClass: props.animation,\n maxDepth: props.maxDepth,\n maxNodes: props.maxNodes,\n });\n },\n});\n","/**\n * Shared placeholder icon renderers for leaf nodes (image / video). Lives at\n * one site so both `CloneNode.ts` (clone mode) and `StructuralLayerNode.ts`\n * (Recipe 3 structural mode) render identical glyphs.\n */\nimport { h, type VNode } from 'vue';\n\nexport function renderImageIcon(): VNode {\n return h(\n 'svg',\n {\n class: 'a-skel-clone-icon',\n viewBox: '0 0 24 24',\n 'aria-hidden': 'true',\n },\n [\n h('path', {\n d: 'M19 5H5a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2Zm-3.5 4a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3ZM19 17H5l3.5-4.5 2.5 3 3.5-4.5L19 17Z',\n fill: 'currentColor',\n }),\n ]\n );\n}\n\nexport function renderPlayIcon(): VNode {\n return h(\n 'svg',\n {\n class: 'a-skel-clone-icon',\n viewBox: '0 0 24 24',\n 'aria-hidden': 'true',\n },\n [\n h('circle', {\n cx: 12,\n cy: 12,\n r: 10,\n stroke: 'currentColor',\n 'stroke-width': 1.5,\n fill: 'none',\n }),\n h('path', { d: 'M10 8l6 4-6 4V8Z', fill: 'currentColor' }),\n ]\n );\n}\n","/**\n * `CloneNode` — recursive renderer for one node of a `CaptureSnapshot`.\n *\n * Design:\n * - **Strategy table by `CapturedNode.kind`**. Each kind ('container' |\n * 'text' | 'image' | 'video' | 'media' | 'block') has its own renderer\n * function. Adding a new kind is one entry in `RENDERERS` — no edits\n * elsewhere (Open/Closed).\n * - **Pure render function**. No reactive state of its own; everything\n * flows from props.\n * - **Composition**: per-line text bars share the same shape as block\n * leaves so there's no behaviour duplication.\n */\nimport { defineComponent, h, type PropType, type VNode } from 'vue';\nimport type { CapturedNode, TextLineRect } from '../utils/captureStyles';\nimport { renderImageIcon, renderPlayIcon } from './icons';\n\ninterface RendererCtx {\n node: CapturedNode;\n animClass: string | null;\n /** Convert a captured node into its absolute-positioned style object. */\n blockStyle: (n: CapturedNode) => Record<string, unknown>;\n /** Build the inline style for a per-line text bar. */\n lineStyle: (\n line: TextLineRect,\n parentStyle: Readonly<Record<string, string>>\n ) => Record<string, unknown>;\n}\n\ntype Renderer = (ctx: RendererCtx) => VNode;\n\n/* ─────────────────────────────────────────────────────────────────────────────\n * Strategy table — one renderer per `CapturedNode.kind`.\n * ───────────────────────────────────────────────────────────────────────────── */\nconst RENDERERS: Record<CapturedNode['kind'], Renderer> = {\n container: renderContainer,\n text: renderText,\n image: (ctx) => renderLeafWithIcon(ctx, 'image'),\n video: (ctx) => renderLeafWithIcon(ctx, 'video'),\n media: (ctx) => renderLeaf(ctx),\n block: (ctx) => renderLeaf(ctx),\n};\n\n/**\n * Container — positioned wrapper with captured background / border / shadow.\n * No `.a-skel` class so the surface shows through exactly as in the real DOM.\n * Recurse into children via the same `CloneNode`.\n *\n * `CapturedNode.{x,y}` is always root-relative, but children render inside\n * this container — itself `position: absolute`. If we hand children the\n * root-relative coords as-is, their `left` / `top` resolve against the\n * container (their new offset parent), doubling the offset. Pass a\n * `blockStyle` closure that subtracts this container's offset so each\n * descendant lands at its captured root-relative position regardless of\n * how deeply it's nested.\n */\nfunction renderContainer(ctx: RendererCtx): VNode {\n const { node } = ctx;\n const childBlockStyle = (n: CapturedNode): Record<string, unknown> => ({\n position: 'absolute',\n left: `${n.x - node.x}px`,\n top: `${n.y - node.y}px`,\n width: `${n.w}px`,\n height: `${n.h}px`,\n ...n.style,\n });\n return h(\n 'div',\n {\n class: 'a-skel-clone-container',\n style: ctx.blockStyle(node),\n 'aria-hidden': 'true',\n },\n (node.children ?? []).map((child) =>\n h(CloneNode, {\n node: child,\n animClass: ctx.animClass,\n blockStyle: childBlockStyle,\n lineStyle: ctx.lineStyle,\n })\n )\n );\n}\n\n/**\n * Text — container carrying captured background/border, with per-line\n * shimmer bars positioned absolutely inside. Each text line becomes one bar\n * at the exact rendered text rect (multi-line / wrapped / RTL all replay 1:1).\n */\nfunction renderText(ctx: RendererCtx): VNode {\n const { node, animClass } = ctx;\n /* Fallback to a single full-rect bar if the Range API wasn't usable. */\n const lines = node.textLines ?? [{ x: node.x, y: node.y, w: node.w, h: node.h }];\n return h(\n 'div',\n {\n class: 'a-skel-clone-container a-skel-clone-text',\n style: ctx.blockStyle(node),\n 'aria-hidden': 'true',\n },\n lines.map((line) =>\n h('div', {\n class: ['a-skel-clone-textbar', animClass],\n style: ctx.lineStyle(\n /* Convert root-relative line coords → container-relative. */\n { x: line.x - node.x, y: line.y - node.y, w: line.w, h: line.h },\n node.style\n ),\n })\n )\n );\n}\n\n/** Plain shimmer leaf (block / media). */\nfunction renderLeaf(ctx: RendererCtx): VNode {\n return h('div', {\n class: ['a-skel a-skel-clone-leaf', ctx.animClass],\n style: ctx.blockStyle(ctx.node),\n 'aria-hidden': 'true',\n });\n}\n\n/** Shimmer leaf with a centered placeholder icon (image / video). */\nfunction renderLeafWithIcon(ctx: RendererCtx, kind: 'image' | 'video'): VNode {\n return h(\n 'div',\n {\n class: ['a-skel a-skel-clone-leaf a-skel-clone-leaf--with-icon', ctx.animClass],\n style: ctx.blockStyle(ctx.node),\n 'aria-hidden': 'true',\n },\n [kind === 'image' ? renderImageIcon() : renderPlayIcon()]\n );\n}\n\nexport const CloneNode = defineComponent({\n name: 'CloneNode',\n props: {\n node: { type: Object as PropType<CapturedNode>, required: true },\n animClass: { type: [String, null] as PropType<string | null>, default: null },\n blockStyle: {\n type: Function as PropType<RendererCtx['blockStyle']>,\n required: true,\n },\n lineStyle: {\n type: Function as PropType<RendererCtx['lineStyle']>,\n required: true,\n },\n },\n setup(props) {\n return () => {\n const renderer = RENDERERS[props.node.kind];\n return renderer({\n node: props.node,\n animClass: props.animClass,\n blockStyle: props.blockStyle,\n lineStyle: props.lineStyle,\n });\n };\n },\n});\n","<script setup lang=\"ts\">\nimport { computed, type CSSProperties } from 'vue';\nimport { cn } from '@alikhalilll/a-ui-base';\nimport type { CaptureSnapshot, CapturedNode, TextLineRect } from '../utils/captureStyles';\nimport { CloneNode } from './CloneNode';\n\n/**\n * `<ASkeletonClone>` — replays a `CaptureSnapshot` produced by\n * `captureSnapshot()` as a tree of positioned divs each carrying its\n * captured inline style. Pure render component; the recursive per-node\n * rendering lives in `CloneNode` to keep the strategy table isolated from\n * the layer-level concerns (sizing, animation, a11y).\n */\ninterface Props {\n shape: CaptureSnapshot;\n animation?: 'pulse' | 'shimmer' | 'wave' | 'none';\n class?: string | string[] | Record<string, boolean>;\n}\n\nconst props = withDefaults(defineProps<Props>(), { animation: 'pulse' });\n\nconst animClass = computed(() =>\n props.animation === 'none' ? null : `a-skel-anim-${props.animation}`\n);\n\nconst layerStyle = computed<CSSProperties>(() => ({\n position: 'relative',\n width: `${props.shape.width}px`,\n height: `${props.shape.height}px`,\n}));\n\n/* Pure style builders passed down to `CloneNode`. Kept here so the snapshot's\n * coordinate system (root-relative) stays the layer's concern; the renderer\n * just consumes ready-to-apply style objects. */\nfunction blockStyle(n: CapturedNode): Record<string, unknown> {\n return {\n position: 'absolute',\n left: `${n.x}px`,\n top: `${n.y}px`,\n width: `${n.w}px`,\n height: `${n.h}px`,\n ...n.style,\n };\n}\n\nfunction lineStyle(\n line: TextLineRect,\n parentStyle: Readonly<Record<string, string>>\n): Record<string, unknown> {\n const radius =\n (parentStyle as Record<string, string>).borderTopLeftRadius ?? 'var(--ak-skel-radius-sm)';\n return {\n position: 'absolute',\n left: `${line.x}px`,\n top: `${line.y}px`,\n width: `${line.w}px`,\n height: `${line.h}px`,\n backgroundColor: 'var(--ak-skel-base)',\n borderRadius: radius,\n };\n}\n</script>\n\n<template>\n <div\n :class=\"cn('a-skeleton__clone', props.class)\"\n :style=\"layerStyle\"\n role=\"status\"\n aria-busy=\"true\"\n aria-live=\"polite\"\n >\n <CloneNode\n v-for=\"(node, idx) in props.shape.nodes\"\n :key=\"idx\"\n :node=\"node\"\n :anim-class=\"animClass\"\n :block-style=\"blockStyle\"\n :line-style=\"lineStyle\"\n />\n <span class=\"a-skel-sr-only\">Loading…</span>\n </div>\n</template>\n\n<style scoped>\n.a-skeleton__clone {\n overflow: hidden;\n isolation: isolate;\n}\n\n.a-skeleton__clone :deep(.a-skel-clone-leaf) {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--ak-skel-icon);\n}\n\n.a-skeleton__clone :deep(.a-skel-clone-icon) {\n width: clamp(20px, 30%, 56px);\n height: clamp(20px, 30%, 56px);\n opacity: 0.6;\n}\n\n.a-skeleton__clone :deep(.a-skel-clone-textbar) {\n pointer-events: none;\n}\n</style>\n","/**\n * Shared DOM-read helpers used by both capture strategies:\n * - `captureStyles.ts` (clone-mode comprehensive style snapshot)\n * - `walkStructural.ts` (Recipe 3 tree-shaped capture)\n *\n * One source of truth for \"what counts as a default CSS value\", how to read a\n * computed-style subset into a frozen camelCased object, and how to measure\n * per-line text rectangles. Keeping both walkers behind these helpers prevents\n * silent drift between the two pipelines.\n */\n\n/** A single rendered text-line rectangle, expressed in root-relative pixels. */\nexport interface TextLineRect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\n/**\n * Computed values that count as \"default\" and shouldn't be persisted. Stripped\n * before a captured `style` object lands on a node so a plain unstyled element\n * produces an empty style — keeps snapshots small and the rendered DOM clean.\n */\nexport const SKIP_VALUES: ReadonlySet<string> = new Set([\n 'none',\n 'normal',\n 'auto',\n '0px',\n '0',\n '0 0',\n '0% 0%',\n '0px 0px',\n '0deg',\n '0s',\n 'visible',\n 'static',\n 'transparent',\n 'rgba(0, 0, 0, 0)',\n 'rgb(0, 0, 0, 0)',\n 'initial',\n 'inherit',\n 'unset',\n 'currentcolor',\n]);\n\n/**\n * Read the subset of `props` from `cs` and return a frozen camelCased style\n * map with the SKIP_VALUES entries omitted. `opacity: 1` is treated as default\n * (matches CSS' initial value).\n */\nexport function readComputedStyles(\n cs: CSSStyleDeclaration,\n props: ReadonlyArray<string>\n): Readonly<Record<string, string>> {\n const out: Record<string, string> = {};\n for (const prop of props) {\n const val = cs.getPropertyValue(prop).trim();\n if (!val) continue;\n if (SKIP_VALUES.has(val.toLowerCase())) continue;\n if (prop === 'opacity' && (val === '1' || parseFloat(val) === 1)) continue;\n out[camelCase(prop)] = val;\n }\n return Object.freeze(out);\n}\n\nexport function camelCase(prop: string): string {\n return prop.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n}\n\n/** True when the element has at least one non-whitespace direct text-node child. */\nexport function hasDirectText(el: Element): boolean {\n for (let i = 0; i < el.childNodes.length; i++) {\n const node = el.childNodes[i];\n if (node.nodeType === Node.TEXT_NODE && (node.textContent ?? '').trim().length > 0) {\n return true;\n }\n }\n return false;\n}\n\n/** Element children, with `data-skeleton-ignore` descendants filtered out. */\nexport function collectVisibleChildren(el: Element): HTMLElement[] {\n const out: HTMLElement[] = [];\n for (let i = 0; i < el.children.length; i++) {\n const c = el.children[i] as HTMLElement;\n if (c.dataset?.skeletonIgnore !== undefined) continue;\n out.push(c);\n }\n return out;\n}\n\n/**\n * Per-line text rects via `Range.getClientRects()`. Returns one rect per visual\n * line — exact left/width for each line so wrapped paragraphs, RTL last-line\n * positions, centered headings replay 1:1 without heuristics. Returns\n * `undefined` if the element has no direct text or the Range API isn't usable.\n *\n * Two rects on the same baseline AND horizontally touching (gap ≤ 2 px) are\n * merged so inline spans on the same line collapse to one bar. Same-baseline\n * rects on different visual lines (rare; float-into-paragraph layouts) won't\n * touch horizontally and stay separate.\n */\nexport function captureTextLines(el: Element, origin: DOMRect): TextLineRect[] | undefined {\n if (typeof document === 'undefined' || typeof document.createRange !== 'function')\n return undefined;\n let range: Range;\n try {\n range = document.createRange();\n range.selectNodeContents(el);\n } catch {\n return undefined;\n }\n const rects = range.getClientRects();\n if (!rects || rects.length === 0) return undefined;\n\n const merged: TextLineRect[] = [];\n for (let i = 0; i < rects.length; i++) {\n const r = rects[i];\n if (r.width <= 0 || r.height <= 0) continue;\n const lr: TextLineRect = {\n x: Math.round(r.left - origin.left),\n y: Math.round(r.top - origin.top),\n w: Math.round(r.width),\n h: Math.round(r.height),\n };\n const last = merged[merged.length - 1];\n const sameLine = last && Math.abs(last.y - lr.y) <= 1 && Math.abs(last.h - lr.h) <= 1;\n /* Touching = gap between the trailing edge of `last` and the leading\n * edge of `lr` is at most 2 px (one rounding slack per end). */\n const touching =\n sameLine && Math.max(last!.x, lr.x) - Math.min(last!.x + last!.w, lr.x + lr.w) <= 2;\n if (touching) {\n const leftEdge = Math.min(last!.x, lr.x);\n const rightEdge = Math.max(last!.x + last!.w, lr.x + lr.w);\n last!.x = leftEdge;\n last!.w = rightEdge - leftEdge;\n } else {\n merged.push(lr);\n }\n }\n return merged.length > 0 ? merged : undefined;\n}\n","/**\n * Comprehensive style-capture engine.\n *\n * Walks the slot's rendered DOM after mount and captures **every visible CSS\n * property** of every element it encounters, plus geometry, into a frozen\n * snapshot tree. The snapshot is replayed by `<ASkeletonClone>` as a tree\n * of positioned divs each carrying its captured inline style.\n *\n * Why this exists (vs the DOM-mirror walker in `buildStructuralSkeleton.ts`):\n *\n * - DOM-mirror preserves the slot's vnode tree and inherits styling from the\n * consumer's `class` / inline `style` attributes. That works for *static*\n * styles, but it can't see styles applied via:\n * - JavaScript-set inline style (refs, watchers, animation libs)\n * - CSS-in-JS runtimes that hash class names per instance\n * - DaisyUI / shadcn / custom CSS where the computed result differs\n * from what the class string implies\n * - Scoped styles compiled with content-hash data attributes\n *\n * - `captureSnapshot` reads `getComputedStyle()` for each element — the\n * **final** computed style after the cascade has resolved. Replaying that\n * produces a pixel-identical surface no matter what styling system the\n * consumer uses.\n *\n * Cost is bounded by the same `maxNodes` / `maxDepth` / `minSize` filters\n * as the legacy `walkDom` capture. The whole pass is a single top-down read\n * with no DOM writes between, so the browser does one layout up front.\n */\n\nimport {\n captureTextLines,\n collectVisibleChildren,\n hasDirectText,\n readComputedStyles,\n type TextLineRect,\n} from './domRead';\n\nexport type { TextLineRect };\n\n/** A captured element — geometry + comprehensive style snapshot + children. */\nexport interface CapturedNode {\n /** Tag name lowercased — used by the replay to decide content-type treatment. */\n tag: string;\n /** Root-relative position + size in CSS pixels. */\n x: number;\n y: number;\n w: number;\n h: number;\n /**\n * Frozen, ready-to-apply `style` object. Only non-default visual\n * properties are included — the snapshot for a default `<div>` is tiny.\n */\n style: Readonly<Record<string, string>>;\n /**\n * Content classification — drives how `<ASkeletonClone>` renders the leaf:\n * - `text` → shimmer text bar (optionally with per-line rects)\n * - `image` → solid surface with image-placeholder icon\n * - `video` → solid surface with play-icon\n * - `media` → atomic block (svg/canvas/iframe — no icon)\n * - `block` → opaque shimmer block (default for unrecognised leaves)\n * - `container` → has children; rendered as a positioned wrapper\n */\n kind: 'text' | 'image' | 'video' | 'media' | 'block' | 'container';\n /**\n * Per-line text rects (only set when `kind === 'text'`). Replaces the\n * single-rect bar with one bar per rendered text line at the exact width\n * of that line — handles wrapping, RTL, centered headings 1:1.\n */\n textLines?: ReadonlyArray<TextLineRect>;\n /** Children (only set when `kind === 'container'`). */\n children?: ReadonlyArray<CapturedNode>;\n}\n\nexport interface CaptureSnapshot {\n /** Overall bounding box. */\n width: number;\n height: number;\n /** Top-level captured nodes (siblings of the root's direct children). */\n nodes: ReadonlyArray<CapturedNode>;\n /** True if `maxNodes` was hit and the walk bailed out early. */\n truncated: boolean;\n /** When the snapshot was taken (ms since epoch). For cache invalidation policies. */\n capturedAt: number;\n}\n\nexport interface CaptureOptions {\n /** Max recursion depth. Default 12. */\n maxDepth?: number;\n /** Hard cap on captured nodes. Default 800. */\n maxNodes?: number;\n /** Skip elements smaller than this many CSS pixels (either axis). Default 4. */\n minSize?: number;\n /**\n * When true, capture child elements even inside leaves that we'd normally\n * treat atomically. Default false (atomic = single block).\n */\n walkAtomic?: boolean;\n}\n\nconst DEFAULT_MAX_DEPTH = 12;\nconst DEFAULT_MAX_NODES = 800;\nconst DEFAULT_MIN_SIZE = 4;\n\n/** Tags treated as atomic leaves — no recursion into their contents. */\nconst ATOMIC_TAGS = new Set([\n 'img',\n 'svg',\n 'canvas',\n 'video',\n 'audio',\n 'input',\n 'textarea',\n 'select',\n 'progress',\n 'meter',\n 'hr',\n 'iframe',\n 'object',\n 'embed',\n 'picture',\n 'br',\n]);\n\n/** Tags whose content is text — captured as text bars (per-line via Range). */\nconst TEXT_OWNERS = new Set([\n 'p',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'span',\n 'a',\n 'em',\n 'strong',\n 'small',\n 'code',\n 'b',\n 'i',\n 'mark',\n 'label',\n 'caption',\n 'time',\n 'dt',\n 'dd',\n 'li',\n 'th',\n 'td',\n 'figcaption',\n 'blockquote',\n 'cite',\n 'q',\n]);\n\n/**\n * Visual CSS properties read from `getComputedStyle()`. Property listed here\n * is included in the captured snapshot **only when its value differs from the\n * skip set** — so a plain unstyled `<div>` produces an empty style object.\n *\n * Listed in the order they're written into the snapshot's `style` object so\n * the replay is deterministic across captures.\n */\nconst VISUAL_PROPS = [\n /* Box model — padding only (margin doesn't apply to absolute children). */\n 'padding-top',\n 'padding-right',\n 'padding-bottom',\n 'padding-left',\n\n /* Border — per edge so non-uniform borders survive. */\n 'border-top-width',\n 'border-right-width',\n 'border-bottom-width',\n 'border-left-width',\n 'border-top-style',\n 'border-right-style',\n 'border-bottom-style',\n 'border-left-style',\n 'border-top-color',\n 'border-right-color',\n 'border-bottom-color',\n 'border-left-color',\n 'border-top-left-radius',\n 'border-top-right-radius',\n 'border-bottom-right-radius',\n 'border-bottom-left-radius',\n\n /* Background. */\n 'background-color',\n 'background-image',\n 'background-position',\n 'background-size',\n 'background-repeat',\n 'background-origin',\n 'background-clip',\n\n /* Effects. */\n 'box-shadow',\n 'opacity',\n 'filter',\n 'backdrop-filter',\n 'transform',\n 'transform-origin',\n 'mix-blend-mode',\n\n /* Typography (only meaningful for text leaves but harmless to read for all). */\n 'font-family',\n 'font-size',\n 'font-weight',\n 'font-style',\n 'line-height',\n 'letter-spacing',\n 'text-align',\n 'text-transform',\n 'text-decoration-line',\n 'text-decoration-color',\n];\n\n/**\n * Snapshot the rendered DOM under `root`, returning a frozen tree of every\n * visible element + its computed visual styles. Replaying the snapshot\n * produces a surface visually identical to `root`.\n */\nexport function captureSnapshot(root: HTMLElement, options: CaptureOptions = {}): CaptureSnapshot {\n const maxDepth = options.maxDepth ?? DEFAULT_MAX_DEPTH;\n const maxNodes = options.maxNodes ?? DEFAULT_MAX_NODES;\n const minSize = options.minSize ?? DEFAULT_MIN_SIZE;\n const walkAtomic = options.walkAtomic ?? false;\n\n const rootRect = root.getBoundingClientRect();\n const state = { count: 0, truncated: false };\n const nodes: CapturedNode[] = [];\n\n for (let i = 0; i < root.children.length; i++) {\n if (state.count >= maxNodes) {\n state.truncated = true;\n break;\n }\n const node = capture(root.children[i] as HTMLElement, rootRect, 1, {\n maxDepth,\n maxNodes,\n minSize,\n walkAtomic,\n state,\n });\n if (node) nodes.push(node);\n }\n\n return Object.freeze({\n width: Math.round(rootRect.width),\n height: Math.round(rootRect.height),\n nodes: Object.freeze(nodes),\n truncated: state.truncated,\n capturedAt: Date.now(),\n });\n}\n\ninterface InternalCtx {\n maxDepth: number;\n maxNodes: number;\n minSize: number;\n walkAtomic: boolean;\n state: { count: number; truncated: boolean };\n}\n\nfunction capture(\n el: HTMLElement,\n origin: DOMRect,\n depth: number,\n ctx: InternalCtx\n): CapturedNode | null {\n if (ctx.state.count >= ctx.maxNodes) {\n ctx.state.truncated = true;\n return null;\n }\n if (el.dataset?.skeletonIgnore !== undefined) return null;\n\n const cs = window.getComputedStyle(el);\n if (cs.display === 'none' || cs.visibility === 'hidden') return null;\n /* Opacity zero — skip (the element is invisible). */\n const o = parseFloat(cs.opacity);\n if (Number.isFinite(o) && o === 0) return null;\n\n const rect = el.getBoundingClientRect();\n const tag = el.tagName.toLowerCase();\n const isTextOwnerTag = TEXT_OWNERS.has(tag);\n\n /* Text-owner tags can have zero height when their interpolation is empty\n * (e.g. `<h3>{{ data?.name }}</h3>` with `data === null`). The base\n * `minSize` filter would drop them, leaving the heading invisible in the\n * clone replay. For text-owners only, synthesize a height from the\n * element's `line-height` (or `font-size * 1.4` as a fallback) so the\n * fallback bar still renders at the heading's natural rendered height. */\n let effectiveHeight = rect.height;\n if (isTextOwnerTag && effectiveHeight < ctx.minSize) {\n const lh = parseFloat(cs.lineHeight);\n const fs = parseFloat(cs.fontSize);\n if (Number.isFinite(lh) && lh > 0) effectiveHeight = lh;\n else if (Number.isFinite(fs) && fs > 0) effectiveHeight = fs * 1.4;\n }\n\n if (rect.width < ctx.minSize || effectiveHeight < ctx.minSize) return null;\n\n const x = Math.round(rect.left - origin.left);\n const y = Math.round(rect.top - origin.top);\n const w = Math.round(rect.width);\n const h = Math.round(effectiveHeight);\n\n const style = readComputedStyles(cs, VISUAL_PROPS);\n\n /* Classify the leaf — drives how `<ASkeletonClone>` renders this node. */\n const isAtomic = ATOMIC_TAGS.has(tag);\n const hasOwnText = hasDirectText(el);\n const childrenEls = collectVisibleChildren(el);\n\n let kind: CapturedNode['kind'];\n\n if (tag === 'img' || tag === 'picture') {\n kind = 'image';\n } else if (tag === 'video') {\n kind = 'video';\n } else if (isAtomic) {\n kind = 'media';\n } else if (childrenEls.length === 0 && (hasOwnText || isTextOwnerTag)) {\n /* Text-owner tags with no children (e.g. `<h3>{{ data?.name }}</h3>` with\n * null data) classify as text even though their interpolation is empty —\n * the renderer falls back to a single full-box bar at the element's\n * natural rendered dimensions, so the heading shimmers at the right\n * height instead of rendering as a generic block. */\n kind = 'text';\n } else if (childrenEls.length === 0) {\n kind = 'block';\n } else {\n kind = 'container';\n }\n\n /* For text leaves, capture per-line rects via Range API. */\n let textLines: CapturedNode['textLines'];\n if (kind === 'text') {\n textLines = captureTextLines(el, origin);\n }\n\n /* Recurse into children for containers (and atomic if walkAtomic). */\n let children: CapturedNode[] | undefined;\n if (kind === 'container' && depth < ctx.maxDepth) {\n children = [];\n for (const c of childrenEls) {\n if (ctx.state.count >= ctx.maxNodes) {\n ctx.state.truncated = true;\n break;\n }\n const childNode = capture(c, origin, depth + 1, ctx);\n if (childNode) children.push(childNode);\n }\n if (children.length === 0) {\n /* All children filtered — degrade to block so the surface still renders. */\n children = undefined;\n kind = style && Object.keys(style).length > 0 ? 'block' : 'container';\n }\n } else if ((kind === 'container' && depth >= ctx.maxDepth) || (isAtomic && ctx.walkAtomic)) {\n kind = 'block';\n }\n\n ctx.state.count++;\n\n return Object.freeze({\n tag,\n x,\n y,\n w,\n h,\n style,\n kind,\n textLines: textLines ? Object.freeze(textLines) : undefined,\n children: children ? Object.freeze(children) : undefined,\n });\n}\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, ref, shallowRef, useId, useSlots, watch } from 'vue';\nimport { cn } from '@alikhalilll/a-ui-base';\nimport type { ASkeletonProps, ASkeletonSlots } from '../types';\nimport { StructuralSkeleton } from './StructuralSkeleton';\nimport ASkeletonClone from './ASkeletonClone.vue';\nimport { captureSnapshot, type CaptureSnapshot } from '../utils/captureStyles';\n\n/**\n * `<ASkeleton>` — the package's headline wrapper.\n *\n * Two rendering strategies, selected via `mode`:\n * - `mirror` (default): walks the slot's vnode tree (`buildStructuralSkeleton`)\n * and preserves every element with its real `class` / inline `style`. Pure\n * Vue, SSR-safe, no DOM read.\n * - `clone`: mounts the slot off-screen once, snapshots every leaf's\n * `getComputedStyle()` (`captureSnapshot`), then replays the snapshot via\n * `<ASkeletonClone>` as positioned divs carrying every captured CSS\n * property. Pixel-identical regardless of styling system.\n *\n * The strategies are exclusive — picking one decides the entire loading-state\n * render path. The wrapper itself only orchestrates: it doesn't decide\n * per-element treatment (that's the strategies' job). Single Responsibility:\n * orchestration + a11y + containment.\n */\n\nconst props = withDefaults(defineProps<ASkeletonProps>(), {\n maxDepth: 16,\n maxNodes: 600,\n minNodeSize: 4,\n persist: false,\n animation: 'shimmer',\n fallback: 'shimmer',\n /* Default is `clone` — comprehensive computed-style snapshot + replay,\n * works correctly regardless of how styles reach the DOM (Tailwind, inline\n * style, CSS-in-JS hashes, scoped styles). Switch to `mirror` for SSR-safe,\n * vnode-tree-based skeletons that don't need a client-side measurement pass. */\n mode: 'clone',\n});\ndefineSlots<ASkeletonSlots>();\n\nconst slots = useSlots();\n\nconst instanceId = useId();\nvoid instanceId;\n\nconst animationClass = computed(() =>\n props.animation === 'none' ? null : `a-skel-block--anim-${props.animation}`\n);\n\nconst cloneAnimation = computed(() => props.animation);\n\n/* ─── `mirror` strategy state ─────────────────────────────────────────────── */\nconst mirrorVNodes = computed(() => (props.loading ? (slots.default?.() ?? []) : []));\nconst hasContent = computed(() => mirrorVNodes.value.length > 0);\n\n/* ─── `clone` strategy state ──────────────────────────────────────────────── */\nconst captureRef = ref<HTMLElement | null>(null);\nconst snapshot = shallowRef<CaptureSnapshot | undefined>(undefined);\nconst snapshotValid = computed(\n () => !!snapshot.value && snapshot.value.width > 0 && snapshot.value.height > 0\n);\n/* `snapshotRenderable` — only true when the snapshot has dimensions AND at\n * least one captured node. An empty `nodes` array would render a transparent\n * overlay that masks the mirror backdrop, so we hold the replay layer back\n * until there's actually something to draw. */\nconst snapshotRenderable = computed(\n () => snapshotValid.value && (snapshot.value as CaptureSnapshot).nodes.length > 0\n);\nlet captureFrame: number | undefined;\nlet retryAttempts = 0;\nconst MAX_RETRY_ATTEMPTS = 5;\n\n/* Take a snapshot once the off-screen mount is in the DOM. We schedule via a\n * **double** `requestAnimationFrame` so the browser has time to (1) commit the\n * mount and (2) run layout — without this, the first frame fires before the\n * slot's geometry is measurable when `loading=true` is the initial state, the\n * snapshot comes back with 0×0 dimensions, `<ASkeletonClone>` collapses to\n * nothing, and the user sees a blank skeleton.\n *\n * If the second-frame snapshot still has zero dimensions (the slot is genuinely\n * empty or the layout hasn't settled yet), we retry up to MAX_RETRY_ATTEMPTS\n * times with an exponential-ish backoff via repeated rAF. Past that we give up\n * and the `mirror--fallback` branch keeps showing — see the v-if/v-else-if\n * chain in the template. */\nfunction takeSnapshot() {\n if (captureFrame !== undefined) cancelAnimationFrame(captureFrame);\n retryAttempts = 0;\n scheduleCapture();\n}\n\nfunction scheduleCapture(): void {\n captureFrame = requestAnimationFrame(() => {\n captureFrame = requestAnimationFrame(() => {\n captureFrame = undefined;\n if (!captureRef.value) return;\n const result = captureSnapshot(captureRef.value, {\n maxDepth: props.maxDepth,\n maxNodes: props.maxNodes,\n minSize: props.minNodeSize,\n });\n if (result.width > 0 && result.height > 0) {\n snapshot.value = result;\n return;\n }\n /* Zero-size capture — slot likely hasn't laid out yet. Retry on a later\n * frame, capped so we don't loop forever on a genuinely-empty slot. */\n if (retryAttempts < MAX_RETRY_ATTEMPTS) {\n retryAttempts++;\n scheduleCapture();\n }\n });\n });\n}\n\nwatch(\n captureRef,\n (el) => {\n if (props.mode !== 'clone') return;\n if (el) takeSnapshot();\n },\n /* `flush: 'post'` so the watcher fires *after* Vue has committed the DOM\n * update — the captureRef is set, but the surrounding layout state is also\n * settled, which double-rAF then waits for completion of. */\n { flush: 'post' }\n);\n\n/* Re-capture when the mode flips into clone OR when the slot's vnodes change\n * shape (the watcher above runs on mount; this one covers in-place updates). */\nwatch(\n () => props.mode,\n (mode) => {\n if (mode === 'clone' && captureRef.value) takeSnapshot();\n }\n);\n\n/* Re-capture when the slot's content shape changes (e.g. data arrives and\n * `loading` flips false → true again with new vnodes). Without this the first\n * snapshot is the only snapshot, and a second load shows the cached stale\n * geometry from the very first mount. */\nwatch(\n () => props.loading,\n (next, prev) => {\n if (props.mode !== 'clone') return;\n if (next && !prev && captureRef.value) takeSnapshot();\n }\n);\n\nonBeforeUnmount(() => {\n if (captureFrame !== undefined) cancelAnimationFrame(captureFrame);\n});\n</script>\n\n<template>\n <div\n :class=\"cn('a-skeleton', `a-skeleton--mode-${props.mode}`, props.class)\"\n :data-loading=\"props.loading ? '' : undefined\"\n role=\"status\"\n :aria-busy=\"props.loading ? 'true' : undefined\"\n :aria-live=\"props.loading ? 'polite' : undefined\"\n >\n <template v-if=\"props.mode === 'clone'\">\n <!-- Off-screen capture mount: the slot is always rendered (so we have a\n live target to snapshot from) but visually suppressed while the\n skeleton is showing. `aria-hidden` keeps it out of AT trees too. -->\n <div\n ref=\"captureRef\"\n class=\"a-skeleton__capture\"\n :class=\"props.loading ? 'a-skeleton__capture--hidden' : null\"\n :aria-hidden=\"props.loading ? 'true' : undefined\"\n >\n <slot />\n </div>\n\n <!-- Mirror fallback — **always rendered as a backdrop** while loading,\n regardless of snapshot state. The replay layer below sits on top of\n it (higher z-index). If the snapshot turns out to be empty / zero-\n sized / otherwise unrenderable, the mirror underneath still gives the\n user a structural skeleton instead of a blank wrapper. -->\n <div\n v-if=\"props.loading && hasContent\"\n class=\"a-skeleton__mirror a-skeleton__mirror--fallback\"\n >\n <StructuralSkeleton\n :vnodes=\"mirrorVNodes\"\n :animation=\"animationClass\"\n :max-depth=\"maxDepth\"\n :max-nodes=\"maxNodes\"\n />\n </div>\n\n <!-- Replay layer — wrapped in a positioning div whose scoped styles\n are GUARANTEED to apply (a child-component root only inherits the\n parent's scope when no inner div is present; placing the absolute-\n positioning on a regular div in the parent template removes that\n ambiguity). Gated on `snapshotValid` (width AND height > 0) AND\n snapshot.nodes.length > 0 so an empty capture doesn't render a\n transparent overlay that masks the mirror underneath. -->\n <div v-if=\"props.loading && snapshotRenderable\" class=\"a-skeleton__replay\">\n <ASkeletonClone :shape=\"snapshot!\" :animation=\"cloneAnimation\" />\n </div>\n </template>\n\n <template v-else>\n <template v-if=\"props.loading\">\n <div v-if=\"hasContent\" class=\"a-skeleton__mirror\">\n <StructuralSkeleton\n :vnodes=\"mirrorVNodes\"\n :animation=\"animationClass\"\n :max-depth=\"maxDepth\"\n :max-nodes=\"maxNodes\"\n />\n </div>\n <div v-else class=\"a-skeleton__fallback\">\n <slot name=\"fallback\">\n <div\n class=\"a-skel-block a-skel-block--block a-skel-fallback-default\"\n :class=\"animationClass\"\n />\n </slot>\n </div>\n </template>\n <slot v-else />\n </template>\n </div>\n</template>\n\n<style scoped>\n.a-skeleton {\n display: block;\n position: relative;\n}\n\n.a-skeleton[data-loading] {\n overflow: hidden;\n overflow: clip;\n overflow-clip-margin: 0;\n}\n\n.a-skeleton__mirror :deep(*) {\n user-select: none;\n pointer-events: none;\n}\n\n.a-skeleton__mirror :deep(button),\n.a-skeleton__mirror :deep(input),\n.a-skeleton__mirror :deep(a) {\n cursor: default;\n}\n\n.a-skeleton__fallback :deep(.a-skel-fallback-default) {\n width: 100%;\n height: 4rem;\n border-radius: 0.5rem;\n}\n\n/* Clone-mode capture mount: needs to be in the DOM so we can read computed\n * styles from it, but invisible while the snapshot replay is showing. We use\n * `visibility: hidden` (not `display: none`) so layout is preserved — the\n * snapshot needs real geometry. `pointer-events: none` keeps it inert. */\n.a-skeleton__capture--hidden {\n visibility: hidden;\n pointer-events: none;\n user-select: none;\n /* The capture mount sits behind the replay (z-index 0 vs 1) so the replay\n * paints over it. We keep it in normal flow so its `getBoundingClientRect`\n * still reports the real layout (off-flow positioning would zero it). */\n}\n\n.a-skeleton__replay {\n position: absolute;\n inset: 0;\n z-index: 1;\n}\n\n.a-skeleton__mirror--fallback {\n position: absolute;\n inset: 0;\n /* Sits BEHIND the clone replay (z-index: 0) so when the replay mounts on top\n * it covers the mirror. If the replay turns out to be empty / sized wrong,\n * the mirror underneath still gives the user a structural skeleton instead\n * of a blank wrapper. */\n z-index: 0;\n}\n</style>\n","/**\n * `StructuralLayerNode` — recursive renderer for a `StructuralNode` from a\n * `StructuralShape` captured by `walkStructural`. Used internally by\n * `<ASkeletonLayer>`.\n *\n * Design:\n * - **Strategy table** keyed by `node.kind` + `node.leafKind`. Each kind has\n * its own renderer function. Adding a new kind is one entry in `RENDERERS`\n * (Open/Closed) — no edits elsewhere.\n * - **Pure render function**: no reactive state of its own; everything flows\n * from props.\n * - **Container preservation**: container nodes emit `<{node.tag}\n * :class=\"node.className\" :style=\"node.style\">…children…</…>`. The\n * captured `style` carries comprehensive layout + visual CSS so the\n * skeleton reads correctly even when the consumer's stylesheet isn't\n * loaded at the mount point.\n * - **Leaves**: render `<div class=\"a-skel + originalClass\" :style=\"style\">`.\n * The original `class` is preserved so utility-first CSS (`mt-4`,\n * `flex-1`, `inline-block`, …) survives; the captured style carries the\n * same layout + visual properties used on containers plus `width` +\n * `height` so the placeholder claims the right space.\n */\nimport { defineComponent, h, type PropType, type VNode } from 'vue';\nimport type { ContainerNode, LeafKind, LeafNode, StructuralNode } from '../types';\nimport { renderImageIcon, renderPlayIcon } from './icons';\n\ninterface RendererCtx {\n node: StructuralNode;\n animClass: string | null;\n}\n\ntype Renderer = (ctx: RendererCtx) => VNode;\n\n/* ─────────────────────────────────────────────────────────────────────────────\n * Strategy table — one renderer per kind. Containers carry their captured\n * structure; leaves render as a-skel placeholders.\n * ───────────────────────────────────────────────────────────────────────────── */\nconst LEAF_RENDERERS: Record<LeafKind, (node: LeafNode, animClass: string | null) => VNode> = {\n block: renderLeafBlock,\n media: renderLeafBlock,\n text: renderLeafText,\n image: (node, animClass) => renderLeafWithIcon(node, animClass, 'image'),\n};\n\nfunction renderContainer(node: ContainerNode, animClass: string | null): VNode {\n return h(\n node.tag,\n {\n class: node.className || undefined,\n style: node.style,\n 'aria-hidden': 'true',\n },\n node.children.map((child) => h(StructuralLayerNode, { node: child, animClass }))\n );\n}\n\n/**\n * Build the leaf's `class` payload. Always includes `a-skel` (skeleton\n * surface) + the animation class; the original consumer class trails so it\n * survives the cascade alongside utility-first frameworks.\n */\nfunction leafClass(node: LeafNode, animClass: string | null, extra?: string): string[] {\n const classes: string[] = ['a-skel'];\n if (extra) classes.push(extra);\n if (animClass) classes.push(animClass);\n if (node.className) classes.push(node.className);\n return classes;\n}\n\nfunction renderLeafBlock(node: LeafNode, animClass: string | null): VNode {\n return h('div', {\n class: leafClass(node, animClass),\n style: node.style,\n 'aria-hidden': 'true',\n });\n}\n\n/**\n * Text leaf — host carries the captured layout + visual surface (including\n * the leaf's `width` / `height` so it claims the right space in its parent's\n * layout). Each captured per-line rect renders as one bar inside the host,\n * absolutely positioned at the captured rect (rects are leaf-relative; the\n * host's captured style includes `position: relative` via the `.a-skel-text-host`\n * default — see styles.src.css).\n *\n * When `textLines` is absent (Range API unusable), the leaf renders as a\n * single shimmer bar at the host's bounds — same as a leaf-block.\n */\nfunction renderLeafText(node: LeafNode, animClass: string | null): VNode {\n const lines = node.textLines;\n if (!lines || lines.length === 0) {\n return h('div', {\n class: leafClass(node, animClass, 'a-skel--text'),\n style: node.style,\n 'aria-hidden': 'true',\n });\n }\n return h(\n 'div',\n {\n class: ['a-skel-text-host', node.className || undefined],\n style: node.style,\n 'aria-hidden': 'true',\n },\n lines.map((line) =>\n h('div', {\n class: ['a-skel', 'a-skel--text-line', animClass],\n style: {\n position: 'absolute',\n left: `${line.x}px`,\n top: `${line.y}px`,\n width: `${line.w}px`,\n height: `${line.h}px`,\n },\n })\n )\n );\n}\n\nfunction renderLeafWithIcon(\n node: LeafNode,\n animClass: string | null,\n kind: 'image' | 'video'\n): VNode {\n return h(\n 'div',\n {\n class: leafClass(node, animClass, 'a-skel--with-icon'),\n style: node.style,\n 'aria-hidden': 'true',\n },\n [kind === 'image' ? renderImageIcon() : renderPlayIcon()]\n );\n}\n\nconst RENDERERS: Record<'container' | 'leaf', Renderer> = {\n container: (ctx) => renderContainer(ctx.node as ContainerNode, ctx.animClass),\n leaf: (ctx) => {\n const leaf = ctx.node as LeafNode;\n return LEAF_RENDERERS[leaf.leafKind](leaf, ctx.animClass);\n },\n};\n\nexport const StructuralLayerNode = defineComponent({\n name: 'StructuralLayerNode',\n props: {\n node: { type: Object as PropType<StructuralNode>, required: true },\n animClass: { type: [String, null] as PropType<string | null>, default: null },\n },\n setup(props) {\n return () =>\n RENDERERS[props.node.kind]({\n node: props.node,\n animClass: props.animClass,\n });\n },\n});\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { cn } from '@alikhalilll/a-ui-base';\nimport type { ASkeletonLayerProps } from '../types';\nimport { StructuralLayerNode } from './StructuralLayerNode';\n\n/**\n * `<ASkeletonLayer>` — replays a `StructuralShape` produced by\n * `walkStructural` / `useSkeleton()` as a tree of preserved containers +\n * a-skel leaf placeholders. The layer is a transparent shell with no\n * width / height / position constraints, so it drops into the consumer's\n * own container and lets the captured tree's flex/grid/spacing dictate\n * how the skeleton lays itself out.\n */\nconst props = withDefaults(defineProps<ASkeletonLayerProps>(), {\n animation: 'shimmer',\n});\n\nconst animationClass = computed<string | null>(() =>\n props.animation === 'none' ? null : `a-skel-anim-${props.animation}`\n);\n</script>\n\n<template>\n <div\n v-if=\"shape\"\n :class=\"cn('a-skeleton__layer', props.class)\"\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n >\n <StructuralLayerNode\n v-for=\"(node, idx) in shape.nodes\"\n :key=\"idx\"\n :node=\"node\"\n :anim-class=\"animationClass\"\n />\n <span class=\"a-skel-sr-only\">Loading…</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, type CSSProperties } from 'vue';\nimport { cn } from '@alikhalilll/a-ui-base';\nimport type { ASkeletonBlockProps } from '../types';\n\nconst props = withDefaults(defineProps<ASkeletonBlockProps>(), {\n type: 'block',\n animation: 'shimmer',\n lines: 1,\n});\n\nconst animationClass = computed(() =>\n props.animation === 'none' ? null : `a-skel-block--anim-${props.animation}`\n);\n\nconst blockClass = computed(() => [\n 'a-skel-block',\n `a-skel-block--${props.type}`,\n animationClass.value,\n]);\n\nfunction toLength(v: number | string | undefined): string | undefined {\n if (v === undefined) return undefined;\n return typeof v === 'number' ? `${v}px` : v;\n}\n\nconst radiusValue = computed(() =>\n props.type === 'circle' && props.radius === undefined ? '50%' : toLength(props.radius)\n);\n\nconst blockStyle = computed<CSSProperties>(() => ({\n width: toLength(props.w),\n height: toLength(props.h),\n borderRadius: radiusValue.value,\n}));\n\nconst isMultiLineText = computed(() => props.type === 'text' && props.lines > 1);\n</script>\n\n<template>\n <div\n v-if=\"isMultiLineText\"\n :class=\"cn('a-skel-block-stack', props.class)\"\n role=\"status\"\n aria-busy=\"true\"\n >\n <div\n v-for=\"i in props.lines\"\n :key=\"i\"\n :class=\"blockClass\"\n :style=\"{\n height: blockStyle.height ?? '0.75em',\n width: i === props.lines ? '70%' : '100%',\n borderRadius: blockStyle.borderRadius ?? '4px',\n }\"\n />\n </div>\n <div\n v-else\n :class=\"cn(blockClass, props.class)\"\n :style=\"blockStyle\"\n role=\"status\"\n aria-busy=\"true\"\n />\n</template>\n\n<style scoped>\n.a-skel-block-stack {\n display: flex;\n flex-direction: column;\n gap: 0.35rem;\n width: 100%;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, type HTMLAttributes } from 'vue';\nimport { cn } from '@alikhalilll/a-ui-base';\n\ninterface Props {\n lines?: number;\n width?: number | string;\n /** Animation variant. Default `'pulse'`. */\n animation?: 'pulse' | 'shimmer' | 'wave' | 'none';\n class?: HTMLAttributes['class'];\n}\n\nconst props = withDefaults(defineProps<Props>(), { lines: 1, animation: 'pulse' });\n\nconst animClass = computed(() =>\n props.animation === 'none' ? null : `a-skel-anim-${props.animation}`\n);\nconst rootStyle = computed(() =>\n props.width !== undefined\n ? { width: typeof props.width === 'number' ? `${props.width}px` : String(props.width) }\n : undefined\n);\n\nfunction widthForLine(i: number): string {\n /* Vuetify-style: last line ≈ 65 %, intermediate lines ≈ 85–100 %.\n * This adds rhythm so a 3-line paragraph doesn't look like a brick. */\n if (i === props.lines - 1 && props.lines > 1) return '65%';\n const palette = ['100%', '92%', '88%', '95%'];\n return palette[i % palette.length]!;\n}\n</script>\n\n<template>\n <div\n :class=\"cn('a-skel-variants-text', props.class)\"\n :style=\"rootStyle\"\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n >\n <div\n v-for=\"i in props.lines\"\n :key=\"i\"\n :class=\"cn('a-skel a-skel-variant-text', animClass)\"\n :style=\"{ width: widthForLine(i - 1), marginTop: i > 1 ? '0.5em' : undefined }\"\n />\n <span class=\"a-skel-sr-only\">Loading…</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, type HTMLAttributes } from 'vue';\nimport { cn } from '@alikhalilll/a-ui-base';\n\ninterface Props {\n level?: 1 | 2 | 3 | 4 | 5 | 6;\n width?: number | string;\n animation?: 'pulse' | 'shimmer' | 'wave' | 'none';\n class?: HTMLAttributes['class'];\n}\n\nconst props = withDefaults(defineProps<Props>(), { level: 2, animation: 'pulse' });\n\nconst animClass = computed(() =>\n props.animation === 'none' ? null : `a-skel-anim-${props.animation}`\n);\n\nconst HEIGHT_BY_LEVEL: Record<number, string> = {\n 1: '2.25rem',\n 2: '1.75rem',\n 3: '1.5rem',\n 4: '1.25rem',\n 5: '1.125rem',\n 6: '1rem',\n};\n\nconst rootStyle = computed(() => ({\n width:\n props.width !== undefined\n ? typeof props.width === 'number'\n ? `${props.width}px`\n : String(props.width)\n : '60%',\n height: HEIGHT_BY_LEVEL[props.level],\n}));\n</script>\n\n<template>\n <div\n :class=\"cn('a-skel a-skel-variant-heading', animClass, props.class)\"\n :style=\"rootStyle\"\n role=\"status\"\n aria-busy=\"true\"\n >\n <span class=\"a-skel-sr-only\">Loading heading…</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, type HTMLAttributes } from 'vue';\nimport { cn } from '@alikhalilll/a-ui-base';\n\ninterface Props {\n size?: number | string;\n shape?: 'circle' | 'square' | 'rounded';\n animation?: 'pulse' | 'shimmer' | 'wave' | 'none';\n class?: HTMLAttributes['class'];\n}\n\nconst props = withDefaults(defineProps<Props>(), { size: 48, shape: 'circle', animation: 'pulse' });\n\nconst animClass = computed(() =>\n props.animation === 'none' ? null : `a-skel-anim-${props.animation}`\n);\n\nconst sizeStyle = computed(() => {\n const s = typeof props.size === 'number' ? `${props.size}px` : String(props.size);\n return {\n width: s,\n height: s,\n borderRadius:\n props.shape === 'circle'\n ? '9999px'\n : props.shape === 'rounded'\n ? 'var(--ak-skel-radius)'\n : '0',\n };\n});\n</script>\n\n<template>\n <div\n :class=\"cn('a-skel a-skel-variant-avatar', animClass, props.class)\"\n :style=\"sizeStyle\"\n role=\"status\"\n aria-busy=\"true\"\n >\n <span class=\"a-skel-sr-only\">Loading avatar…</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, type HTMLAttributes } from 'vue';\nimport { cn } from '@alikhalilll/a-ui-base';\n\ninterface Props {\n ratio?: string;\n width?: number | string;\n height?: number | string;\n showIcon?: boolean;\n animation?: 'pulse' | 'shimmer' | 'wave' | 'none';\n class?: HTMLAttributes['class'];\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n ratio: '16 / 9',\n showIcon: true,\n animation: 'pulse',\n});\n\nconst animClass = computed(() =>\n props.animation === 'none' ? null : `a-skel-anim-${props.animation}`\n);\n\nconst rootStyle = computed(() => {\n const s: Record<string, string> = {};\n if (props.ratio) s.aspectRatio = props.ratio;\n if (props.width !== undefined)\n s.width = typeof props.width === 'number' ? `${props.width}px` : String(props.width);\n if (props.height !== undefined)\n s.height = typeof props.height === 'number' ? `${props.height}px` : String(props.height);\n return s;\n});\n</script>\n\n<template>\n <div\n :class=\"cn('a-skel a-skel-variant-image', animClass, props.class)\"\n :style=\"rootStyle\"\n role=\"status\"\n aria-busy=\"true\"\n >\n <svg\n v-if=\"props.showIcon\"\n class=\"size-10\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M19 5H5a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2Zm-3.5 4a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3ZM19 17H5l3.5-4.5 2.5 3 3.5-4.5L19 17Z\"\n fill=\"currentColor\"\n />\n </svg>\n <span class=\"a-skel-sr-only\">Loading image…</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, type HTMLAttributes } from 'vue';\nimport { cn } from '@alikhalilll/a-ui-base';\n\ninterface Props {\n ratio?: string;\n width?: number | string;\n height?: number | string;\n showIcon?: boolean;\n animation?: 'pulse' | 'shimmer' | 'wave' | 'none';\n class?: HTMLAttributes['class'];\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n ratio: '16 / 9',\n showIcon: true,\n animation: 'pulse',\n});\n\nconst animClass = computed(() =>\n props.animation === 'none' ? null : `a-skel-anim-${props.animation}`\n);\n\nconst rootStyle = computed(() => {\n const s: Record<string, string> = {};\n if (props.ratio) s.aspectRatio = props.ratio;\n if (props.width !== undefined)\n s.width = typeof props.width === 'number' ? `${props.width}px` : String(props.width);\n if (props.height !== undefined)\n s.height = typeof props.height === 'number' ? `${props.height}px` : String(props.height);\n return s;\n});\n</script>\n\n<template>\n <div\n :class=\"cn('a-skel a-skel-variant-video', animClass, props.class)\"\n :style=\"rootStyle\"\n role=\"status\"\n aria-busy=\"true\"\n >\n <svg\n v-if=\"props.showIcon\"\n class=\"size-12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"1.5\" />\n <path d=\"M10 8l6 4-6 4V8Z\" fill=\"currentColor\" />\n </svg>\n <span class=\"a-skel-sr-only\">Loading video…</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, type HTMLAttributes } from 'vue';\nimport { cn } from '@alikhalilll/a-ui-base';\n\ninterface Props {\n width?: number | string;\n height?: number | string;\n outlined?: boolean;\n animation?: 'pulse' | 'shimmer' | 'wave' | 'none';\n class?: HTMLAttributes['class'];\n}\n\nconst props = withDefaults(defineProps<Props>(), { width: 120, height: 40, animation: 'pulse' });\n\nconst animClass = computed(() =>\n props.animation === 'none' ? null : `a-skel-anim-${props.animation}`\n);\n\nconst rootStyle = computed(() => ({\n width: typeof props.width === 'number' ? `${props.width}px` : String(props.width),\n height: typeof props.height === 'number' ? `${props.height}px` : String(props.height),\n ...(props.outlined\n ? { backgroundColor: 'transparent', border: '1px solid var(--ak-skel-ring)' }\n : {}),\n}));\n</script>\n\n<template>\n <div\n :class=\"cn('a-skel a-skel-variant-button', animClass, props.class)\"\n :style=\"rootStyle\"\n role=\"status\"\n aria-busy=\"true\"\n >\n <span class=\"a-skel-sr-only\">Loading button…</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, type HTMLAttributes } from 'vue';\nimport { cn } from '@alikhalilll/a-ui-base';\n\ninterface Props {\n width?: number | string;\n height?: number | string;\n animation?: 'pulse' | 'shimmer' | 'wave' | 'none';\n class?: HTMLAttributes['class'];\n}\n\nconst props = withDefaults(defineProps<Props>(), { width: '100%', height: 40, animation: 'pulse' });\n\nconst animClass = computed(() =>\n props.animation === 'none' ? null : `a-skel-anim-${props.animation}`\n);\n\nconst rootStyle = computed(() => ({\n width: typeof props.width === 'number' ? `${props.width}px` : String(props.width),\n height: typeof props.height === 'number' ? `${props.height}px` : String(props.height),\n}));\n</script>\n\n<template>\n <div\n :class=\"cn('a-skel a-skel-variant-input', animClass, props.class)\"\n :style=\"rootStyle\"\n role=\"status\"\n aria-busy=\"true\"\n >\n <span class=\"a-skel-sr-only\">Loading input…</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, type HTMLAttributes } from 'vue';\nimport { cn } from '@alikhalilll/a-ui-base';\nimport ASkeletonAvatar from './ASkeletonAvatar.vue';\nimport ASkeletonText from './ASkeletonText.vue';\n\ninterface Props {\n avatar?: boolean;\n lines?: 1 | 2 | 3;\n trailing?: boolean;\n animation?: 'pulse' | 'shimmer' | 'wave' | 'none';\n class?: HTMLAttributes['class'];\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n avatar: true,\n lines: 2,\n trailing: false,\n animation: 'pulse',\n});\n\nconst animClass = computed(() =>\n props.animation === 'none' ? null : `a-skel-anim-${props.animation}`\n);\n</script>\n\n<template>\n <div :class=\"cn('a-skel-variant-list-item', props.class)\" role=\"status\" aria-busy=\"true\">\n <ASkeletonAvatar v-if=\"props.avatar\" :size=\"40\" :animation=\"props.animation\" />\n <div class=\"a-skel-variant-list-item__body\">\n <ASkeletonText :lines=\"props.lines\" :animation=\"props.animation\" />\n </div>\n <div\n v-if=\"props.trailing\"\n :class=\"cn('a-skel a-skel-variant-button', animClass)\"\n :style=\"{ width: '40px', height: '24px' }\"\n />\n <span class=\"a-skel-sr-only\">Loading list item…</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { type HTMLAttributes } from 'vue';\nimport { cn } from '@alikhalilll/a-ui-base';\nimport ASkeletonImage from './ASkeletonImage.vue';\nimport ASkeletonHeading from './ASkeletonHeading.vue';\nimport ASkeletonText from './ASkeletonText.vue';\nimport ASkeletonButton from './ASkeletonButton.vue';\nimport ASkeletonAvatar from './ASkeletonAvatar.vue';\n\ninterface Props {\n media?: boolean;\n heading?: boolean;\n lines?: number;\n actions?: boolean;\n footerAvatar?: boolean;\n animation?: 'pulse' | 'shimmer' | 'wave' | 'none';\n class?: HTMLAttributes['class'];\n}\n\nwithDefaults(defineProps<Props>(), {\n media: true,\n heading: true,\n lines: 3,\n actions: true,\n footerAvatar: false,\n animation: 'pulse',\n});\n</script>\n\n<template>\n <div :class=\"cn('a-skel-variant-card', $props.class)\" role=\"status\" aria-busy=\"true\">\n <ASkeletonImage v-if=\"$props.media\" :animation=\"$props.animation\" />\n <ASkeletonHeading v-if=\"$props.heading\" :level=\"3\" :animation=\"$props.animation\" />\n <ASkeletonText :lines=\"$props.lines\" :animation=\"$props.animation\" />\n <div v-if=\"$props.actions\" class=\"mt-2 flex gap-2\">\n <ASkeletonButton :width=\"96\" :height=\"36\" :animation=\"$props.animation\" />\n <ASkeletonButton :width=\"96\" :height=\"36\" outlined :animation=\"$props.animation\" />\n </div>\n <div v-if=\"$props.footerAvatar\" class=\"mt-3 flex items-center gap-3\">\n <ASkeletonAvatar :size=\"36\" :animation=\"$props.animation\" />\n <div style=\"flex: 1\">\n <ASkeletonText :lines=\"2\" :animation=\"$props.animation\" />\n </div>\n </div>\n <span class=\"a-skel-sr-only\">Loading card…</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, type HTMLAttributes } from 'vue';\nimport { cn } from '@alikhalilll/a-ui-base';\n\ninterface Props {\n rows?: number;\n columns?: number;\n showHeader?: boolean;\n animation?: 'pulse' | 'shimmer' | 'wave' | 'none';\n class?: HTMLAttributes['class'];\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n rows: 5,\n columns: 4,\n showHeader: true,\n animation: 'pulse',\n});\n\nconst animClass = computed(() =>\n props.animation === 'none' ? null : `a-skel-anim-${props.animation}`\n);\n\nconst rowStyle = computed(() => ({\n gridTemplateColumns: `repeat(${props.columns}, minmax(0, 1fr))`,\n}));\n</script>\n\n<template>\n <div :class=\"cn('a-skel-variant-table', props.class)\" role=\"status\" aria-busy=\"true\">\n <div v-if=\"props.showHeader\" class=\"a-skel-variant-table__row\" :style=\"rowStyle\">\n <div\n v-for=\"c in props.columns\"\n :key=\"`h-${c}`\"\n :class=\"cn('a-skel a-skel-variant-heading', animClass)\"\n :style=\"{ height: '1.5rem', width: '70%' }\"\n />\n </div>\n <div v-for=\"r in props.rows\" :key=\"r\" class=\"a-skel-variant-table__row\" :style=\"rowStyle\">\n <div\n v-for=\"c in props.columns\"\n :key=\"`${r}-${c}`\"\n :class=\"cn('a-skel a-skel-variant-text', animClass)\"\n :style=\"{ width: c === 1 ? '85%' : c === props.columns ? '50%' : '70%' }\"\n />\n </div>\n <span class=\"a-skel-sr-only\">Loading table…</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, type HTMLAttributes } from 'vue';\nimport { cn } from '@alikhalilll/a-ui-base';\nimport ASkeletonHeading from './ASkeletonHeading.vue';\nimport ASkeletonText from './ASkeletonText.vue';\n\ninterface Props {\n bars?: number;\n height?: number | string;\n showHeader?: boolean;\n animation?: 'pulse' | 'shimmer' | 'wave' | 'none';\n class?: HTMLAttributes['class'];\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n bars: 7,\n height: '8rem',\n showHeader: true,\n animation: 'pulse',\n});\n\nconst animClass = computed(() =>\n props.animation === 'none' ? null : `a-skel-anim-${props.animation}`\n);\n\nconst chartStyle = computed(() => ({\n height: typeof props.height === 'number' ? `${props.height}px` : String(props.height),\n}));\n\n/* Pseudo-random but deterministic bar heights so the chart looks organic but\n * doesn't reshuffle on each render. */\nconst HEIGHTS = [62, 78, 45, 91, 68, 82, 55, 73, 39, 88, 60, 74];\nfunction barHeight(i: number): string {\n return `${HEIGHTS[i % HEIGHTS.length]}%`;\n}\n</script>\n\n<template>\n <div :class=\"cn(props.class)\" role=\"status\" aria-busy=\"true\">\n <template v-if=\"props.showHeader\">\n <ASkeletonHeading :level=\"4\" :animation=\"props.animation\" :width=\"'45%'\" />\n <div style=\"margin-top: 0.4rem\">\n <ASkeletonText :lines=\"1\" :animation=\"props.animation\" :width=\"'60%'\" />\n </div>\n </template>\n <div class=\"a-skel-variant-chart\" :style=\"chartStyle\" style=\"margin-top: 1rem\">\n <div\n v-for=\"i in props.bars\"\n :key=\"i\"\n :class=\"cn('a-skel a-skel-variant-chart__bar', animClass)\"\n :style=\"{ height: barHeight(i - 1) }\"\n />\n </div>\n <span class=\"a-skel-sr-only\">Loading chart…</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { type HTMLAttributes } from 'vue';\nimport { cn } from '@alikhalilll/a-ui-base';\nimport ASkeletonText from './ASkeletonText.vue';\nimport ASkeletonInput from './ASkeletonInput.vue';\nimport ASkeletonButton from './ASkeletonButton.vue';\n\ninterface Props {\n fields?: number;\n showSubmit?: boolean;\n animation?: 'pulse' | 'shimmer' | 'wave' | 'none';\n class?: HTMLAttributes['class'];\n}\n\nwithDefaults(defineProps<Props>(), { fields: 3, showSubmit: true, animation: 'pulse' });\n</script>\n\n<template>\n <div :class=\"cn('flex flex-col gap-4', $props.class)\" role=\"status\" aria-busy=\"true\">\n <div v-for=\"i in $props.fields\" :key=\"i\" class=\"flex flex-col gap-2\">\n <ASkeletonText :lines=\"1\" :width=\"'30%'\" :animation=\"$props.animation\" />\n <ASkeletonInput :animation=\"$props.animation\" />\n </div>\n <ASkeletonButton\n v-if=\"$props.showSubmit\"\n :width=\"120\"\n :height=\"40\"\n :animation=\"$props.animation\"\n />\n <span class=\"a-skel-sr-only\">Loading form…</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { type HTMLAttributes } from 'vue';\nimport { cn } from '@alikhalilll/a-ui-base';\nimport ASkeletonHeading from './ASkeletonHeading.vue';\nimport ASkeletonText from './ASkeletonText.vue';\nimport ASkeletonImage from './ASkeletonImage.vue';\n\ninterface Props {\n media?: boolean;\n paragraphs?: number;\n linesPerParagraph?: number;\n animation?: 'pulse' | 'shimmer' | 'wave' | 'none';\n class?: HTMLAttributes['class'];\n}\n\nwithDefaults(defineProps<Props>(), {\n media: true,\n paragraphs: 3,\n linesPerParagraph: 4,\n animation: 'pulse',\n});\n</script>\n\n<template>\n <article :class=\"cn('flex flex-col gap-4', $props.class)\" role=\"status\" aria-busy=\"true\">\n <ASkeletonHeading :level=\"1\" :animation=\"$props.animation\" />\n <ASkeletonImage v-if=\"$props.media\" :animation=\"$props.animation\" />\n <div v-for=\"i in $props.paragraphs\" :key=\"i\">\n <ASkeletonText :lines=\"$props.linesPerParagraph\" :animation=\"$props.animation\" />\n </div>\n <span class=\"a-skel-sr-only\">Loading article…</span>\n </article>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, type HTMLAttributes } from 'vue';\nimport { cn } from '@alikhalilll/a-ui-base';\n\ninterface Props {\n thickness?: number;\n animation?: 'pulse' | 'shimmer' | 'wave' | 'none';\n class?: HTMLAttributes['class'];\n}\n\nconst props = withDefaults(defineProps<Props>(), { thickness: 1, animation: 'pulse' });\n\nconst animClass = computed(() =>\n props.animation === 'none' ? null : `a-skel-anim-${props.animation}`\n);\nconst rootStyle = computed(() => ({ height: `${props.thickness}px`, width: '100%' }));\n</script>\n\n<template>\n <div\n :class=\"cn('a-skel', animClass, props.class)\"\n :style=\"rootStyle\"\n role=\"separator\"\n aria-hidden=\"true\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { computed, type HTMLAttributes } from 'vue';\nimport { cn } from '@alikhalilll/a-ui-base';\n\ninterface Props {\n width?: number | string;\n height?: number | string;\n animation?: 'pulse' | 'shimmer' | 'wave' | 'none';\n class?: HTMLAttributes['class'];\n}\n\nconst props = withDefaults(defineProps<Props>(), { width: 80, height: 24, animation: 'pulse' });\n\nconst animClass = computed(() =>\n props.animation === 'none' ? null : `a-skel-anim-${props.animation}`\n);\nconst rootStyle = computed(() => ({\n width: typeof props.width === 'number' ? `${props.width}px` : String(props.width),\n height: typeof props.height === 'number' ? `${props.height}px` : String(props.height),\n borderRadius: '9999px',\n display: 'inline-block',\n}));\n</script>\n\n<template>\n <span\n :class=\"cn('a-skel', animClass, props.class)\"\n :style=\"rootStyle\"\n role=\"status\"\n aria-busy=\"true\"\n />\n</template>\n","import type { CSSProperties } from 'vue';\nimport type { CachedShape, ShapeNode, ShapeNodeType, TextLineRect } from '../types';\n\nexport interface WalkOptions {\n maxDepth: number;\n /** Hard cap on captured nodes. Default 500. */\n maxNodes?: number;\n /** Min CSS-pixel size (either axis) for an element to be emitted. Default 4. */\n minSize?: number;\n}\n\nconst DEFAULT_MAX_NODES = 500;\nconst DEFAULT_MIN_SIZE = 4;\n\n/* Atomic elements — never recursed into; rendered as a single block. */\nconst LEAF_TAGS = new Set([\n 'IMG',\n 'SVG',\n 'CANVAS',\n 'VIDEO',\n 'INPUT',\n 'TEXTAREA',\n 'SELECT',\n 'BUTTON',\n 'PROGRESS',\n 'METER',\n 'HR',\n]);\n\n/**\n * Walk `root`'s descendants and produce a list of shimmer blocks that mirror its\n * rendered layout. Coordinates are relative to `root`'s top-left so the result can\n * be replayed in any container of the same size.\n *\n * Performance:\n * - `maxNodes` caps the walk so a 5000-row table doesn't lock up the main thread.\n * - `minSize` filters out hairlines (1-2 px paddings, decorative dots) that\n * inflate node count without adding visual signal.\n * - All `getBoundingClientRect` / `getComputedStyle` reads happen in a single\n * top-down pass with no intervening writes, so the browser does one layout\n * up front and serves cached values from then on (no layout thrashing).\n * - Each emitted `ShapeNode` has a frozen pre-computed `style` (and `lineStyles`\n * for multi-line text) so the render path is allocation-free.\n */\nexport function walkDom(root: HTMLElement, options: WalkOptions): CachedShape {\n const maxNodes = options.maxNodes ?? DEFAULT_MAX_NODES;\n const minSize = options.minSize ?? DEFAULT_MIN_SIZE;\n\n const nodes: ShapeNode[] = [];\n const rootRect = root.getBoundingClientRect();\n let truncated = false;\n\n function visit(el: Element, depth: number): void {\n if (nodes.length >= maxNodes) {\n truncated = true;\n return;\n }\n\n const html = el as HTMLElement;\n if (html.dataset?.skeletonIgnore !== undefined) return;\n\n const cs = window.getComputedStyle(el);\n if (cs.display === 'none' || cs.visibility === 'hidden' || cs.opacity === '0') return;\n\n const rect = el.getBoundingClientRect();\n if (rect.width < minSize || rect.height < minSize) return;\n\n const tag = el.tagName.toUpperCase();\n const isLeafTag = LEAF_TAGS.has(tag);\n const hasStop = html.dataset?.skeletonStop !== undefined;\n const childElements: Element[] = [];\n for (let i = 0; i < el.children.length; i++) {\n const c = el.children[i];\n if ((c as HTMLElement).dataset?.skeletonIgnore === undefined) childElements.push(c);\n }\n const hasOwnText = hasDirectTextContent(el);\n const reachedDepth = depth >= options.maxDepth;\n const isLeaf = isLeafTag || hasStop || reachedDepth || childElements.length === 0;\n\n if (isLeaf) {\n const node = elementToShape(el, tag, cs, rect, rootRect, hasOwnText);\n if (node) nodes.push(node);\n return;\n }\n\n /* Container with a visible surface (background / border / shadow / opacity)\n * — emit a backing block at the container's exact rect BEFORE recursing, so\n * children render on top of a card that keeps its identity. Without this,\n * a `<div class=\"bg-white shadow-lg rounded-2xl\">` wrapping content would\n * vanish from the replay because the walker only ever recurses into it. */\n const containerNode = containerSurfaceToShape(cs, rect, rootRect);\n if (containerNode) nodes.push(containerNode);\n\n for (let i = 0; i < childElements.length; i++) {\n if (nodes.length >= maxNodes) {\n truncated = true;\n return;\n }\n visit(childElements[i], depth + 1);\n }\n }\n\n for (let i = 0; i < root.children.length; i++) {\n if (nodes.length >= maxNodes) {\n truncated = true;\n break;\n }\n visit(root.children[i], 1);\n }\n\n return Object.freeze({\n nodes: Object.freeze(nodes),\n width: Math.round(rootRect.width),\n height: Math.round(rootRect.height),\n truncated,\n }) as CachedShape;\n}\n\nfunction hasDirectTextContent(el: Element): boolean {\n for (let i = 0; i < el.childNodes.length; i++) {\n const node = el.childNodes[i];\n if (node.nodeType === Node.TEXT_NODE && (node.textContent ?? '').trim().length > 0) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Emit a backing block for a container with its own visible surface — real\n * background, border, box-shadow, or non-full opacity. Geometry is the\n * container's exact bounding rect so the width / height / radius match the\n * real DOM 1:1. Returns `null` when the container has no visible surface\n * (a plain unstyled `<div>` is layout-only and shouldn't add a block).\n */\nfunction containerSurfaceToShape(\n cs: CSSStyleDeclaration,\n rect: DOMRect,\n origin: DOMRect\n): ShapeNode | null {\n const bg = readBackgroundColor(cs);\n const border = readBorder(cs);\n const boxShadow = readBoxShadow(cs);\n const opacity = readOpacity(cs);\n if (!bg && !border && !boxShadow && opacity === undefined) return null;\n\n return freezeShape({\n type: 'block',\n x: Math.round(rect.left - origin.left),\n y: Math.round(rect.top - origin.top),\n w: Math.round(rect.width),\n h: Math.round(rect.height),\n radius: parseFloat(cs.borderRadius) || 0,\n bg,\n border,\n boxShadow,\n opacity,\n });\n}\n\nfunction elementToShape(\n el: Element,\n tag: string,\n cs: CSSStyleDeclaration,\n rect: DOMRect,\n origin: DOMRect,\n hasText: boolean\n): ShapeNode | null {\n const x = Math.round(rect.left - origin.left);\n const y = Math.round(rect.top - origin.top);\n const w = Math.round(rect.width);\n const h = Math.round(rect.height);\n\n const radius = parseFloat(cs.borderRadius) || 0;\n const minDim = Math.min(w, h);\n const isCircle = radius >= minDim / 2 - 1 && Math.abs(w - h) <= 2 && minDim > 0;\n\n let type: ShapeNodeType;\n let resolvedRadius = radius;\n let lines: number | undefined;\n let lineHeight: number | undefined;\n let textRects: TextLineRect[] | undefined;\n let textAlign: ShapeNode['textAlign'];\n\n if (tag === 'IMG' || tag === 'SVG' || tag === 'VIDEO' || tag === 'CANVAS') {\n type = 'image';\n } else if (isCircle) {\n type = 'circle';\n resolvedRadius = Math.floor(minDim / 2);\n } else if (hasText) {\n type = 'text';\n lineHeight = Math.round(parseFloat(cs.lineHeight) || parseFloat(cs.fontSize) * 1.4 || 16);\n lines = Math.max(1, Math.round(h / lineHeight));\n resolvedRadius = Math.min(radius, 4);\n textAlign = readTextAlign(cs);\n textRects = measureTextRects(el, origin);\n } else {\n type = 'block';\n }\n\n /* Style detectors — captured for every leaf so the replay carries the actual\n * fill / border / shadow / opacity from the real DOM. Each captured value is\n * \"non-default\": skip transparent backgrounds, zero-width borders, \"none\"\n * shadows, opacity≥1 — so the persisted payload stays small. */\n const bg = readBackgroundColor(cs);\n const border = readBorder(cs);\n const boxShadow = readBoxShadow(cs);\n const opacity = readOpacity(cs);\n\n return freezeShape({\n type,\n x,\n y,\n w,\n h,\n radius: resolvedRadius,\n lines,\n lineHeight,\n textRects,\n bg,\n border,\n boxShadow,\n opacity,\n textAlign,\n });\n}\n\n/**\n * Per-line text rects via `Range.getClientRects()`. Returns one rect per visual\n * line of rendered text — exact left/width for each line so wrapped paragraphs,\n * RTL last-line position, centered headings all replay 1:1 without heuristics.\n * Returns `undefined` if the element has no direct text content or the Range\n * API isn't usable in this environment.\n */\nfunction measureTextRects(el: Element, origin: DOMRect): TextLineRect[] | undefined {\n if (typeof document === 'undefined' || typeof document.createRange !== 'function')\n return undefined;\n let range: Range;\n try {\n range = document.createRange();\n range.selectNodeContents(el);\n } catch {\n return undefined;\n }\n const rects = range.getClientRects();\n if (!rects || rects.length === 0) return undefined;\n /* De-duplicate rects that share the same baseline AND actually touch\n * horizontally. Two inline spans on the same line emit two rects with\n * identical y/h whose x ranges abut; merging them gives one bar that\n * spans the whole rendered line. Two rects with the same y/h on\n * different visual lines (rare, but possible with float-into-paragraph\n * layouts) won't touch horizontally, so they stay separate.\n *\n * We keep zero-width rects out (they're real but invisible — collapsed\n * whitespace at line breaks), but we don't filter sub-pixel `width`/\n * `height` — those are legitimate (1-glyph symbol, etc). */\n const merged: TextLineRect[] = [];\n for (let i = 0; i < rects.length; i++) {\n const r = rects[i];\n if (r.width <= 0 || r.height <= 0) continue;\n const lr: TextLineRect = {\n x: Math.round(r.left - origin.left),\n y: Math.round(r.top - origin.top),\n w: Math.round(r.width),\n h: Math.round(r.height),\n };\n const last = merged[merged.length - 1];\n const sameLine = last && Math.abs(last.y - lr.y) <= 1 && Math.abs(last.h - lr.h) <= 1;\n /* Touching = `gap` between the trailing edge of `last` and the leading\n * edge of `lr` is at most 2 px (one rounding slack on each end). */\n const touching =\n sameLine && Math.max(last!.x, lr.x) - Math.min(last!.x + last!.w, lr.x + lr.w) <= 2;\n if (touching) {\n const leftEdge = Math.min(last!.x, lr.x);\n const rightEdge = Math.max(last!.x + last!.w, lr.x + lr.w);\n last!.x = leftEdge;\n last!.w = rightEdge - leftEdge;\n } else {\n merged.push(lr);\n }\n }\n return merged.length > 0 ? merged : undefined;\n}\n\nconst TRANSPARENT_RE = /^(transparent|rgba?\\([^)]*,\\s*0(\\.0+)?\\s*\\)|hsla?\\([^)]*,\\s*0%?\\s*\\))$/i;\n\nfunction readBackgroundColor(cs: CSSStyleDeclaration): string | undefined {\n const bg = cs.backgroundColor;\n if (!bg || TRANSPARENT_RE.test(bg)) return undefined;\n return bg;\n}\n\nfunction readBorder(cs: CSSStyleDeclaration): string | undefined {\n /* Treat the top border as representative — uniform borders are the common case.\n * Skip 0-width and `none` style. */\n const width = parseFloat(cs.borderTopWidth) || 0;\n if (width < 0.5) return undefined;\n const style = cs.borderTopStyle;\n if (!style || style === 'none' || style === 'hidden') return undefined;\n const color = cs.borderTopColor;\n if (!color || TRANSPARENT_RE.test(color)) return undefined;\n return `${Math.round(width)}px ${style} ${color}`;\n}\n\nfunction readBoxShadow(cs: CSSStyleDeclaration): string | undefined {\n const sh = cs.boxShadow;\n if (!sh || sh === 'none') return undefined;\n return sh;\n}\n\nfunction readOpacity(cs: CSSStyleDeclaration): number | undefined {\n const o = parseFloat(cs.opacity);\n if (!Number.isFinite(o) || o >= 1) return undefined;\n if (o <= 0) return undefined; /* fully transparent — caller already skipped these */\n return Math.round(o * 100) / 100;\n}\n\nfunction readTextAlign(cs: CSSStyleDeclaration): ShapeNode['textAlign'] {\n const ta = cs.textAlign as ShapeNode['textAlign'] | undefined;\n if (!ta) return undefined;\n if (\n ta === 'left' ||\n ta === 'right' ||\n ta === 'center' ||\n ta === 'justify' ||\n ta === 'start' ||\n ta === 'end'\n ) {\n return ta;\n }\n return undefined;\n}\n\n/**\n * Pre-compute (and freeze) the inline styles used at render time. Doing it once\n * here means rendering 500 blocks doesn't allocate 500 style objects per frame.\n *\n * Captured visual signals (bg, border, shadow, opacity) are merged into the\n * frozen style so the replay carries the real DOM's surface — a white button\n * stays white, a ring-bordered button keeps its ring, a shadowed card keeps\n * its elevation.\n */\nfunction freezeShape(node: {\n type: ShapeNodeType;\n x: number;\n y: number;\n w: number;\n h: number;\n radius: number;\n lines?: number;\n lineHeight?: number;\n textRects?: TextLineRect[];\n bg?: string;\n border?: string;\n boxShadow?: string;\n opacity?: number;\n textAlign?: ShapeNode['textAlign'];\n}): ShapeNode {\n const baseStyle: CSSProperties = {\n left: `${node.x}px`,\n top: `${node.y}px`,\n width: `${node.w}px`,\n height: `${node.h}px`,\n borderRadius: `${node.radius}px`,\n };\n applyVisualSignals(baseStyle, node);\n const style = Object.freeze(baseStyle);\n\n let lineStyles: ReadonlyArray<Readonly<CSSProperties>> | undefined;\n\n /* Range-based per-line capture — exact rendered geometry, no heuristics.\n * Bars sit at the exact captured rect; no shrink/centre math, so dense\n * paragraphs don't accumulate baseline drift. */\n if (node.type === 'text' && node.textRects && node.textRects.length > 0) {\n const radiusStr = `${node.radius}px`;\n const arr: Readonly<CSSProperties>[] = [];\n for (const r of node.textRects) {\n const lineStyle: CSSProperties = {\n left: `${r.x}px`,\n top: `${r.y}px`,\n width: `${r.w}px`,\n height: `${r.h}px`,\n borderRadius: radiusStr,\n };\n applyVisualSignals(lineStyle, node);\n arr.push(Object.freeze(lineStyle));\n }\n lineStyles = Object.freeze(arr);\n } else if (node.type === 'text' && node.lines && node.lines > 1) {\n /* Fallback path (kept for shapes rehydrated from pre-2 captures): synthesize\n * lines from `lines` + `lineHeight`. */\n const lh = node.lineHeight ?? Math.round(node.h / node.lines);\n const barHeight = Math.max(8, Math.round(lh * 0.7));\n const widthFull = node.w;\n const widthLast = Math.max(40, Math.round(node.w * 0.7));\n const heightStr = `${barHeight}px`;\n const radiusStr = `${node.radius}px`;\n const arr: Readonly<CSSProperties>[] = [];\n for (let i = 1; i <= node.lines; i++) {\n const isLast = i === node.lines;\n const lineWidth = isLast ? widthLast : widthFull;\n /* Honour captured text-align so the short last line lands where the eye\n * expects: right for RTL, centered for centered headings. */\n let leftX = node.x;\n if (isLast && node.textAlign) {\n const slack = widthFull - lineWidth;\n if (node.textAlign === 'center') leftX = node.x + Math.round(slack / 2);\n else if (node.textAlign === 'right' || node.textAlign === 'end') leftX = node.x + slack;\n }\n const lineStyle: CSSProperties = {\n left: `${leftX}px`,\n top: `${node.y + (i - 1) * lh}px`,\n width: `${lineWidth}px`,\n height: heightStr,\n borderRadius: radiusStr,\n };\n applyVisualSignals(lineStyle, node);\n arr.push(Object.freeze(lineStyle));\n }\n lineStyles = Object.freeze(arr);\n }\n\n return Object.freeze({\n type: node.type,\n x: node.x,\n y: node.y,\n w: node.w,\n h: node.h,\n radius: node.radius,\n lines: node.lines,\n lineHeight: node.lineHeight,\n textRects: node.textRects ? Object.freeze(node.textRects) : undefined,\n bg: node.bg,\n border: node.border,\n boxShadow: node.boxShadow,\n opacity: node.opacity,\n textAlign: node.textAlign,\n style,\n lineStyles,\n });\n}\n\n/**\n * Merge captured surface signals into a style object in place. Each signal is\n * additive; `bg` uses `background` shorthand so it wipes the default linear\n * gradient on `.a-skel-block` cleanly.\n */\nfunction applyVisualSignals(\n out: CSSProperties,\n node: {\n bg?: string;\n border?: string;\n boxShadow?: string;\n opacity?: number;\n }\n): void {\n if (node.bg) {\n /* Use `background` (shorthand) so the default `background-image` gradient\n * from `.a-skel-block` is overridden, not stacked. */\n out.background = node.bg;\n }\n if (node.border) {\n out.border = node.border;\n }\n if (node.boxShadow) {\n out.boxShadow = node.boxShadow;\n }\n if (node.opacity !== undefined) {\n out.opacity = node.opacity;\n }\n}\n","import { onBeforeUnmount, watch } from 'vue';\nimport type { CachedShape, StructuralShape } from '../types';\nimport { walkDom } from '../utils/walkDom';\n\nexport type ProbeShape = CachedShape | StructuralShape;\n\n/**\n * Pluggable capture strategy. `walkDom` is the default (flat, absolute-\n * positioned `CachedShape`). Recipe 3 passes `walkStructural` to produce a\n * tree-shaped `StructuralShape` instead.\n */\nexport type CaptureStrategy<S extends ProbeShape> = (\n el: HTMLElement,\n options: { maxDepth: number; maxNodes?: number; minSize?: number }\n) => S;\n\nexport interface ShapeProbeOptions<S extends ProbeShape = CachedShape> {\n maxDepth: number;\n /** Forwarded to the capture strategy. Default 500. */\n maxNodes?: number;\n /** Forwarded to the capture strategy. Default 4. */\n minSize?: number;\n /**\n * Debounce window for `ResizeObserver`-triggered re-captures, in ms.\n * Default 150. Prevents a re-walk every animation frame while the user is\n * actively dragging the viewport edge. The first capture (initial mount) is\n * always immediate via `requestAnimationFrame`.\n */\n resizeDebounceMs?: number;\n /**\n * Capture strategy. Default: `walkDom` (flat positioned-block model).\n * Pass `walkStructural` for the tree-shaped Recipe 3 model.\n */\n capture?: CaptureStrategy<S>;\n onCapture: (shape: S) => void;\n}\n\nconst DEFAULT_RESIZE_DEBOUNCE_MS = 150;\n\n/**\n * Observe `getTarget()` and capture its rendered shape whenever the element\n * appears or resizes.\n *\n * Performance:\n * - Initial capture runs via `requestAnimationFrame` so it sneaks into the\n * first idle window after mount — no synchronous layout from inside the\n * render queue.\n * - Subsequent `ResizeObserver` callbacks are debounced (default 150 ms) so a\n * drag-resize doesn't trigger a fresh DOM walk per frame.\n * - The capture strategy itself enforces `maxNodes` so even a worst-case\n * capture (10k descendants) returns in bounded time.\n */\nexport function useShapeProbe<S extends ProbeShape = CachedShape>(\n getTarget: () => HTMLElement | null,\n options: ShapeProbeOptions<S>\n): void {\n let observer: ResizeObserver | undefined;\n let frame: number | undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let hasCaptured = false;\n\n const debounceMs = options.resizeDebounceMs ?? DEFAULT_RESIZE_DEBOUNCE_MS;\n const captureFn = options.capture ?? (walkDom as unknown as CaptureStrategy<S>);\n\n function cleanup() {\n if (observer) {\n observer.disconnect();\n observer = undefined;\n }\n if (frame !== undefined) {\n cancelAnimationFrame(frame);\n frame = undefined;\n }\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n }\n }\n\n function capture(el: HTMLElement) {\n const result = captureFn(el, {\n maxDepth: options.maxDepth,\n maxNodes: options.maxNodes,\n minSize: options.minSize,\n });\n /* Both shape variants expose `width`, `height`, `nodes` — guard against an\n * empty capture (target rendered with zero size or an unreachable subtree)\n * so the cache never receives a meaningless entry. */\n if (result.width > 0 && result.height > 0 && result.nodes.length > 0) {\n hasCaptured = true;\n options.onCapture(result);\n }\n }\n\n function scheduleImmediate(el: HTMLElement) {\n if (frame !== undefined) cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => {\n frame = undefined;\n capture(el);\n });\n }\n\n function scheduleDebounced(el: HTMLElement) {\n if (timer !== undefined) clearTimeout(timer);\n timer = setTimeout(() => {\n timer = undefined;\n capture(el);\n }, debounceMs);\n }\n\n watch(\n getTarget,\n (el) => {\n cleanup();\n hasCaptured = false;\n if (!el || typeof window === 'undefined') return;\n scheduleImmediate(el);\n if (typeof ResizeObserver !== 'undefined') {\n observer = new ResizeObserver(() => {\n /* ResizeObserver fires once on observe() — let the rAF capture above\n * handle the initial measurement, then debounce everything that\n * follows so a drag-resize doesn't trigger a re-walk per frame. */\n if (hasCaptured) scheduleDebounced(el);\n });\n observer.observe(el);\n }\n },\n { immediate: true, flush: 'post' }\n );\n\n onBeforeUnmount(cleanup);\n}\n","import type { CSSProperties } from 'vue';\nimport type {\n CachedShape,\n ContainerNode,\n LeafNode,\n ShapeNode,\n StructuralNode,\n StructuralShape,\n} from '../types';\n\nconst memory = new Map<string, CachedShape>();\nconst STORAGE_PREFIX = 'a-skeleton:';\n\n/**\n * Schema version for persisted flat `CachedShape` entries. Bump whenever the\n * `ShapeNode` / `CachedShape` field set changes so stale localStorage payloads\n * from older releases get dropped on read instead of rehydrating into a wrong\n * layout.\n *\n * v2 — added advanced surface signals (textRects, bg, border, boxShadow,\n * opacity, textAlign).\n */\nconst SCHEMA_VERSION = 2;\n\n/**\n * Separate in-memory + localStorage namespace for the Recipe 3 structural\n * shape (`StructuralShape`, `v: 3`). Kept apart from the flat-shape cache so\n * the two pipelines can't collide on the same `cacheKey` — `<ASkeleton>`'s\n * legacy cache-replay path and Recipe 3 may both run on the same page with\n * the same key.\n */\nconst structuralMemory = new Map<string, StructuralShape>();\nconst STRUCTURAL_PREFIX = 'a-skeleton:s:';\nconst STRUCTURAL_SCHEMA_VERSION = 3 as const;\n\ninterface PersistedShape {\n v: number;\n width: number;\n height: number;\n nodes: Partial<ShapeNode>[];\n truncated?: boolean;\n}\n\n/**\n * Lookup a captured shape by key. Reads in-memory first, then `localStorage` if\n * `persist` is enabled. SSR-safe — bypasses `window` access on the server.\n * Rehydrates pre-computed styles for shapes deserialized from older sessions\n * (Object.freeze + style/lineStyles don't survive `JSON.stringify` round-trip).\n * Drops the entry if it was written by a different schema version.\n */\nexport function getCached(key: string, persist: boolean): CachedShape | undefined {\n const hit = memory.get(key);\n if (hit) return hit;\n if (!persist || typeof window === 'undefined') return undefined;\n try {\n const storageKey = STORAGE_PREFIX + key;\n const raw = window.localStorage.getItem(storageKey);\n if (!raw) return undefined;\n const parsed = JSON.parse(raw) as Partial<PersistedShape>;\n if (parsed.v !== SCHEMA_VERSION) {\n /* Stale payload from a previous release — purge so the next capture\n * writes a fresh entry instead of rehydrating into a wrong layout. */\n window.localStorage.removeItem(storageKey);\n return undefined;\n }\n const rehydrated = rehydrateShape(parsed as PersistedShape);\n memory.set(key, rehydrated);\n return rehydrated;\n } catch {\n return undefined;\n }\n}\n\n/** Store a captured shape. `persist=true` mirrors to `localStorage`. */\nexport function setCached(key: string, value: CachedShape, persist: boolean): void {\n memory.set(key, value);\n if (!persist || typeof window === 'undefined') return;\n try {\n /* Only the geometry survives the round-trip; styles get rebuilt on read. */\n const lean: PersistedShape = {\n v: SCHEMA_VERSION,\n width: value.width,\n height: value.height,\n nodes: leanNodes(value.nodes),\n truncated: value.truncated,\n };\n window.localStorage.setItem(STORAGE_PREFIX + key, JSON.stringify(lean));\n } catch {\n /* quota exceeded / disabled storage — silently degrade to in-memory only. */\n }\n}\n\n/**\n * Drop a single entry (or all entries when no key) — wipes both the flat-shape\n * and the structural-shape namespaces. Exposed for tests + manual invalidation.\n */\nexport function clearCached(key?: string): void {\n if (!key) {\n memory.clear();\n structuralMemory.clear();\n if (typeof window === 'undefined') return;\n try {\n /* Use Storage's own length + key(i) iteration — `Object.keys()` on a\n * Storage object isn't reliable across implementations (works in real\n * browsers via the Storage[Symbol.iterator] hack, but strict polyfills\n * return only own enumerable properties). */\n const ls = window.localStorage;\n const stale: string[] = [];\n for (let i = 0; i < ls.length; i++) {\n const k = ls.key(i);\n if (!k) continue;\n if (k.startsWith(STORAGE_PREFIX) || k.startsWith(STRUCTURAL_PREFIX)) stale.push(k);\n }\n /* Remove in a second pass so we don't shift indices mid-iteration. */\n for (const k of stale) ls.removeItem(k);\n } catch {\n /* ignore */\n }\n return;\n }\n memory.delete(key);\n structuralMemory.delete(key);\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.removeItem(STORAGE_PREFIX + key);\n window.localStorage.removeItem(STRUCTURAL_PREFIX + key);\n } catch {\n /* ignore */\n }\n}\n\n/**\n * Drop a single structural-shape entry (or all when no key). Kept separate\n * from `clearCached` so callers that only manage structural shapes don't have\n * to reach across namespaces.\n */\nexport function clearCachedStructural(key?: string): void {\n if (!key) {\n structuralMemory.clear();\n if (typeof window === 'undefined') return;\n try {\n const ls = window.localStorage;\n const stale: string[] = [];\n for (let i = 0; i < ls.length; i++) {\n const k = ls.key(i);\n if (k && k.startsWith(STRUCTURAL_PREFIX)) stale.push(k);\n }\n for (const k of stale) ls.removeItem(k);\n } catch {\n /* ignore */\n }\n return;\n }\n structuralMemory.delete(key);\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.removeItem(STRUCTURAL_PREFIX + key);\n } catch {\n /* ignore */\n }\n}\n\n/* ─────────────────────────────────────────────────────────────────────────────\n * Structural-shape cache — backs Recipe 3 (`useSkeleton()` +\n * `<ASkeletonLayer>`). The schema-version check auto-purges stale `v: 2`\n * entries (or any future mismatched version) on read.\n * ───────────────────────────────────────────────────────────────────────────── */\n\ninterface PersistedStructuralShape {\n v: typeof STRUCTURAL_SCHEMA_VERSION;\n width: number;\n height: number;\n nodes: StructuralNode[];\n truncated: boolean;\n capturedAt: number;\n}\n\n/**\n * Lookup a structural shape by key. Reads in-memory first, then `localStorage`\n * when `persist` is enabled. Stale schema versions get purged on read.\n */\nexport function getCachedStructural(key: string, persist: boolean): StructuralShape | undefined {\n const hit = structuralMemory.get(key);\n if (hit) return hit;\n if (!persist || typeof window === 'undefined') return undefined;\n try {\n const storageKey = STRUCTURAL_PREFIX + key;\n const raw = window.localStorage.getItem(storageKey);\n if (!raw) return undefined;\n const parsed = JSON.parse(raw) as Partial<PersistedStructuralShape>;\n if (parsed.v !== STRUCTURAL_SCHEMA_VERSION) {\n window.localStorage.removeItem(storageKey);\n return undefined;\n }\n const rehydrated = rehydrateStructuralShape(parsed as PersistedStructuralShape);\n structuralMemory.set(key, rehydrated);\n return rehydrated;\n } catch {\n return undefined;\n }\n}\n\n/** Store a structural shape. `persist=true` mirrors to `localStorage`. */\nexport function setCachedStructural(key: string, value: StructuralShape, persist: boolean): void {\n structuralMemory.set(key, value);\n if (!persist || typeof window === 'undefined') return;\n try {\n const payload: PersistedStructuralShape = {\n v: STRUCTURAL_SCHEMA_VERSION,\n width: value.width,\n height: value.height,\n nodes: value.nodes.map(leanStructuralNode),\n truncated: value.truncated,\n capturedAt: value.capturedAt,\n };\n window.localStorage.setItem(STRUCTURAL_PREFIX + key, JSON.stringify(payload));\n } catch {\n /* quota / disabled storage — silently degrade to in-memory only. */\n }\n}\n\n/* JSON-stringify drops `undefined`, but `Object.freeze` survives across the\n * round-trip only if we re-freeze after parse. The lean transforms keep\n * payload size predictable (no unexpected enumerable Vue proxies). */\nfunction leanStructuralNode(node: StructuralNode): StructuralNode {\n if (node.kind === 'container') {\n return {\n kind: 'container',\n tag: node.tag,\n className: node.className,\n style: node.style,\n children: node.children.map(leanStructuralNode),\n } as ContainerNode;\n }\n return {\n kind: 'leaf',\n leafKind: node.leafKind,\n className: node.className,\n style: node.style,\n textLines: node.textLines,\n } as LeafNode;\n}\n\nfunction rehydrateStructuralShape(persisted: PersistedStructuralShape): StructuralShape {\n return Object.freeze({\n v: STRUCTURAL_SCHEMA_VERSION,\n width: persisted.width,\n height: persisted.height,\n nodes: Object.freeze(persisted.nodes.map(rehydrateStructuralNode)),\n truncated: persisted.truncated,\n capturedAt: persisted.capturedAt,\n }) as StructuralShape;\n}\n\nfunction rehydrateStructuralNode(node: StructuralNode): StructuralNode {\n if (node.kind === 'container') {\n return Object.freeze({\n kind: 'container',\n tag: node.tag,\n className: node.className,\n style: Object.freeze({ ...node.style }),\n children: Object.freeze(node.children.map(rehydrateStructuralNode)),\n }) as ContainerNode;\n }\n return Object.freeze({\n kind: 'leaf',\n leafKind: node.leafKind,\n className: node.className ?? '',\n style: Object.freeze({ ...node.style }),\n textLines: node.textLines ? Object.freeze([...node.textLines]) : undefined,\n }) as LeafNode;\n}\n\n/**\n * Rebuild `style` + `lineStyles` for nodes that lost them via serialization.\n * Walks the array in-place where possible and freezes the result so the render\n * path stays allocation-free.\n */\nfunction rehydrateShape(shape: PersistedShape): CachedShape {\n const nodes = shape.nodes.map((n) => freezeNodeStyles(n as ShapeNode));\n return Object.freeze({\n nodes: Object.freeze(nodes),\n width: shape.width,\n height: shape.height,\n truncated: shape.truncated,\n }) as CachedShape;\n}\n\nfunction leanNodes(nodes: ReadonlyArray<ShapeNode>): Partial<ShapeNode>[] {\n /* Strip the (re-derivable) style fields before persisting so the localStorage\n * payload stays small — a 500-node shape would otherwise serialize ~500 frozen\n * style objects redundantly. */\n return nodes.map((n) => ({\n type: n.type,\n x: n.x,\n y: n.y,\n w: n.w,\n h: n.h,\n radius: n.radius,\n lines: n.lines,\n lineHeight: n.lineHeight,\n textRects: n.textRects\n ? n.textRects.map((r) => ({ x: r.x, y: r.y, w: r.w, h: r.h }))\n : undefined,\n bg: n.bg,\n border: n.border,\n boxShadow: n.boxShadow,\n opacity: n.opacity,\n textAlign: n.textAlign,\n }));\n}\n\nfunction freezeNodeStyles(node: ShapeNode): ShapeNode {\n const baseStyle: CSSProperties = {\n left: `${node.x}px`,\n top: `${node.y}px`,\n width: `${node.w}px`,\n height: `${node.h}px`,\n borderRadius: `${node.radius}px`,\n };\n applyVisualSignals(baseStyle, node);\n const style = Object.freeze(baseStyle);\n\n let lineStyles: ReadonlyArray<Readonly<CSSProperties>> | undefined;\n\n if (node.type === 'text' && node.textRects && node.textRects.length > 0) {\n const radiusStr = `${node.radius}px`;\n const arr: Readonly<CSSProperties>[] = [];\n for (const r of node.textRects) {\n const lineStyle: CSSProperties = {\n left: `${r.x}px`,\n top: `${r.y}px`,\n width: `${r.w}px`,\n height: `${r.h}px`,\n borderRadius: radiusStr,\n };\n applyVisualSignals(lineStyle, node);\n arr.push(Object.freeze(lineStyle));\n }\n lineStyles = Object.freeze(arr);\n } else if (node.type === 'text' && node.lines && node.lines > 1) {\n const lh = node.lineHeight ?? Math.round(node.h / node.lines);\n const barHeight = Math.max(8, Math.round(lh * 0.7));\n const widthFull = node.w;\n const widthLast = Math.max(40, Math.round(node.w * 0.7));\n const heightStr = `${barHeight}px`;\n const radiusStr = `${node.radius}px`;\n const arr: Readonly<CSSProperties>[] = [];\n for (let i = 1; i <= node.lines; i++) {\n const isLast = i === node.lines;\n const lineWidth = isLast ? widthLast : widthFull;\n let leftX = node.x;\n if (isLast && node.textAlign) {\n const slack = widthFull - lineWidth;\n if (node.textAlign === 'center') leftX = node.x + Math.round(slack / 2);\n else if (node.textAlign === 'right' || node.textAlign === 'end') leftX = node.x + slack;\n }\n const lineStyle: CSSProperties = {\n left: `${leftX}px`,\n top: `${node.y + (i - 1) * lh}px`,\n width: `${lineWidth}px`,\n height: heightStr,\n borderRadius: radiusStr,\n };\n applyVisualSignals(lineStyle, node);\n arr.push(Object.freeze(lineStyle));\n }\n lineStyles = Object.freeze(arr);\n }\n\n return Object.freeze({\n type: node.type,\n x: node.x,\n y: node.y,\n w: node.w,\n h: node.h,\n radius: node.radius,\n lines: node.lines,\n lineHeight: node.lineHeight,\n textRects: node.textRects ? Object.freeze(node.textRects) : undefined,\n bg: node.bg,\n border: node.border,\n boxShadow: node.boxShadow,\n opacity: node.opacity,\n textAlign: node.textAlign,\n style,\n lineStyles,\n });\n}\n\nfunction applyVisualSignals(\n out: CSSProperties,\n node: { bg?: string; border?: string; boxShadow?: string; opacity?: number }\n): void {\n if (node.bg) out.background = node.bg;\n if (node.border) out.border = node.border;\n if (node.boxShadow) out.boxShadow = node.boxShadow;\n if (node.opacity !== undefined) out.opacity = node.opacity;\n}\n","/**\n * `walkStructural` — tree-shaped DOM capture for Recipe 3\n * (`useSkeleton()` + `<ASkeletonLayer>`).\n *\n * Walks the rendered DOM top-down once. Every element is classified as either:\n *\n * - **container** — has element children. Output preserves its tag + original\n * `class` + a comprehensive capture of layout + visual CSS. Children\n * recurse via the same walker. The result *flows* through the consumer's\n * own layout rules instead of being absolutely positioned to fixed\n * coordinates, so the skeleton stays correct when the viewport / parent\n * reflows.\n * - **leaf-{block, text, image, media}** — atomic or childless element.\n * Output is a `<div class=\"a-skel\">` with captured `width`, `height`,\n * plus the **same** layout + visual capture used for containers. No\n * `position: absolute` — the leaf sits inside whatever space its parent\n * reserves for it. Original class is preserved so utility-first CSS\n * (`mt-4`, `flex-1`, `inline-block`, …) survives.\n *\n * Generic property set — containers and leaves use one shared list\n * (`LAYOUT_PROPS` + `VISUAL_PROPS`). This mirrors clone-mode's design: every\n * captured node carries the same layout context, so any element type (flex\n * item, inline-block, positioned overlay, sticky bar) renders correctly\n * without bespoke per-kind logic. The only leaf-specific transform is\n * normalising `display: inline` → `inline-block`, since width / height don't\n * apply to inline boxes.\n *\n * Performance: all `getBoundingClientRect()` + `getComputedStyle()` reads\n * happen in a single top-down pass with no intervening writes, so the browser\n * does one layout up front and serves cached values from then on (no layout\n * thrashing). Same `maxDepth` / `maxNodes` / `minSize` budget as `walkDom` and\n * `captureSnapshot`.\n */\nimport type { CSSProperties } from 'vue';\nimport type {\n ContainerNode,\n LeafKind,\n LeafNode,\n StructuralNode,\n StructuralShape,\n StructuralTextLineRect,\n} from '../types';\nimport {\n captureTextLines,\n collectVisibleChildren,\n hasDirectText,\n readComputedStyles,\n} from './domRead';\n\nexport interface WalkStructuralOptions {\n /** Max recursion depth. Default 12. */\n maxDepth?: number;\n /** Hard cap on captured nodes. Default 500. */\n maxNodes?: number;\n /** Skip elements smaller than this many CSS pixels (either axis). Default 4. */\n minSize?: number;\n}\n\nconst DEFAULT_MAX_DEPTH = 12;\nconst DEFAULT_MAX_NODES = 500;\nconst DEFAULT_MIN_SIZE = 4;\n\n/** Tags treated as atomic leaves — never recursed into, rendered as one block. */\nconst ATOMIC_TAGS: ReadonlySet<string> = new Set([\n 'img',\n 'picture',\n 'svg',\n 'canvas',\n 'video',\n 'audio',\n 'input',\n 'textarea',\n 'select',\n 'button',\n 'progress',\n 'meter',\n 'hr',\n 'iframe',\n 'object',\n 'embed',\n 'br',\n]);\n\n/**\n * Tags whose content is conventionally text. When the author writes\n * `<h3>{{ data?.name }}</h3>` and `data` is null during loading, the\n * interpolation is empty and `hasDirectText` returns false — without this\n * fallback the element classifies as `leaf-block` (a generic shimmer rect)\n * instead of `leaf-text` (a shimmer text bar at the element's natural\n * rendered dimensions).\n */\nconst TEXT_OWNERS: ReadonlySet<string> = new Set([\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'p',\n 'span',\n 'a',\n 'em',\n 'strong',\n 'small',\n 'code',\n 'b',\n 'i',\n 'mark',\n 'label',\n 'caption',\n 'time',\n 'dt',\n 'dd',\n 'li',\n 'th',\n 'td',\n 'figcaption',\n 'blockquote',\n 'cite',\n 'q',\n]);\n\n/**\n * Layout-affecting CSS captured on **every** node. Includes display + box\n * model + flex + grid + positioning so any element type renders correctly\n * regardless of its role in the parent's layout (flex item, inline-block,\n * absolutely-positioned overlay, sticky bar, grid cell).\n *\n * Width / height are intentionally NOT here — containers get sized by their\n * children; leaves get explicit width / height from their `getBoundingClientRect`\n * in `emitLeaf` below.\n */\nconst LAYOUT_PROPS: ReadonlyArray<string> = [\n /* Box model & flow. */\n 'display',\n 'position',\n 'top',\n 'right',\n 'bottom',\n 'left',\n 'z-index',\n 'vertical-align',\n 'float',\n 'clear',\n 'box-sizing',\n\n /* Margins (outer-box spacing — survives the structural layout). */\n 'margin-top',\n 'margin-right',\n 'margin-bottom',\n 'margin-left',\n\n /* Padding (inner inset — matters for containers carrying their own surface). */\n 'padding-top',\n 'padding-right',\n 'padding-bottom',\n 'padding-left',\n\n /* Flex — both as a container AND as an item (align-self, justify-self, flex). */\n 'flex',\n 'flex-direction',\n 'flex-wrap',\n 'flex-grow',\n 'flex-shrink',\n 'flex-basis',\n 'justify-content',\n 'align-items',\n 'align-content',\n 'align-self',\n 'justify-self',\n 'gap',\n 'row-gap',\n 'column-gap',\n 'order',\n\n /* Grid — both as a container AND as a cell. */\n 'grid-template-columns',\n 'grid-template-rows',\n 'grid-template-areas',\n 'grid-auto-flow',\n 'grid-auto-columns',\n 'grid-auto-rows',\n 'grid-column',\n 'grid-row',\n 'grid-area',\n];\n\n/**\n * Visual signals captured on **every** node. These give each rendered\n * placeholder the same surface identity the real element had — fill,\n * outline, elevation, transparency, transforms.\n */\nconst VISUAL_PROPS: ReadonlyArray<string> = [\n /* Borders per edge — non-uniform borders (e.g. `border-b`) survive. */\n 'border-top-width',\n 'border-right-width',\n 'border-bottom-width',\n 'border-left-width',\n 'border-top-style',\n 'border-right-style',\n 'border-bottom-style',\n 'border-left-style',\n 'border-top-color',\n 'border-right-color',\n 'border-bottom-color',\n 'border-left-color',\n 'border-top-left-radius',\n 'border-top-right-radius',\n 'border-bottom-right-radius',\n 'border-bottom-left-radius',\n\n /* Background. */\n 'background-color',\n 'background-image',\n 'background-position',\n 'background-size',\n 'background-repeat',\n 'background-origin',\n 'background-clip',\n\n /* Effects. */\n 'box-shadow',\n 'opacity',\n 'filter',\n 'backdrop-filter',\n 'transform',\n 'transform-origin',\n 'mix-blend-mode',\n];\n\nconst ALL_PROPS: ReadonlyArray<string> = [...LAYOUT_PROPS, ...VISUAL_PROPS];\n\n/**\n * Walk `root`'s descendants and produce a frozen tree-shaped capture.\n * Direct children of `root` become top-level `nodes`; recursive children\n * live on their respective `ContainerNode`s.\n */\nexport function walkStructural(\n root: HTMLElement,\n options: WalkStructuralOptions = {}\n): StructuralShape {\n const maxDepth = options.maxDepth ?? DEFAULT_MAX_DEPTH;\n const maxNodes = options.maxNodes ?? DEFAULT_MAX_NODES;\n const minSize = options.minSize ?? DEFAULT_MIN_SIZE;\n\n const rootRect = root.getBoundingClientRect();\n const state = { count: 0, truncated: false };\n const ctx: InternalCtx = { maxDepth, maxNodes, minSize, state };\n\n const nodes: StructuralNode[] = [];\n for (let i = 0; i < root.children.length; i++) {\n if (state.count >= maxNodes) {\n state.truncated = true;\n break;\n }\n const node = capture(root.children[i] as HTMLElement, rootRect, 1, ctx);\n if (node) nodes.push(node);\n }\n\n return Object.freeze({\n width: Math.round(rootRect.width),\n height: Math.round(rootRect.height),\n nodes: Object.freeze(nodes),\n truncated: state.truncated,\n capturedAt: Date.now(),\n v: 3,\n }) as StructuralShape;\n}\n\ninterface InternalCtx {\n maxDepth: number;\n maxNodes: number;\n minSize: number;\n state: { count: number; truncated: boolean };\n}\n\nfunction capture(\n el: HTMLElement,\n origin: DOMRect,\n depth: number,\n ctx: InternalCtx\n): StructuralNode | null {\n if (ctx.state.count >= ctx.maxNodes) {\n ctx.state.truncated = true;\n return null;\n }\n if (el.dataset?.skeletonIgnore !== undefined) return null;\n\n const cs = window.getComputedStyle(el);\n if (cs.display === 'none' || cs.visibility === 'hidden') return null;\n const opacity = parseFloat(cs.opacity);\n if (Number.isFinite(opacity) && opacity === 0) return null;\n\n const rect = el.getBoundingClientRect();\n const tag = el.tagName.toLowerCase();\n const isTextOwner = TEXT_OWNERS.has(tag);\n\n /* Text-owner tags can have zero height when their interpolation is empty\n * (`<h3>{{ data?.name }}</h3>` with null data). For those, synthesize a\n * height from line-height / font-size so the heading still shimmers at its\n * natural rendered height instead of being filtered as sub-minSize. */\n let effectiveHeight = rect.height;\n if (isTextOwner && effectiveHeight < ctx.minSize) {\n const lh = parseFloat(cs.lineHeight);\n const fs = parseFloat(cs.fontSize);\n if (Number.isFinite(lh) && lh > 0) effectiveHeight = lh;\n else if (Number.isFinite(fs) && fs > 0) effectiveHeight = fs * 1.4;\n }\n\n if (rect.width < ctx.minSize || effectiveHeight < ctx.minSize) return null;\n\n const hasStop = el.dataset?.skeletonStop !== undefined;\n const isAtomic = ATOMIC_TAGS.has(tag);\n const reachedDepth = depth >= ctx.maxDepth;\n const childrenEls = collectVisibleChildren(el);\n\n /* Classification — order matters: stop > atomic > childless > container. */\n if (hasStop || isAtomic || reachedDepth || childrenEls.length === 0) {\n return emitLeaf(el, tag, cs, rect, effectiveHeight, isAtomic, ctx);\n }\n\n /* Container path — recurse into children first; if every child was\n * filtered (sub-minSize, hidden, …) we demote this node to a leaf so the\n * container's own visual surface still renders. */\n const children: StructuralNode[] = [];\n for (const child of childrenEls) {\n if (ctx.state.count >= ctx.maxNodes) {\n ctx.state.truncated = true;\n break;\n }\n const node = capture(child, origin, depth + 1, ctx);\n if (node) children.push(node);\n }\n\n if (children.length === 0) {\n return emitLeaf(el, tag, cs, rect, effectiveHeight, /* isAtomic */ false, ctx);\n }\n\n ctx.state.count++;\n const node: ContainerNode = {\n kind: 'container',\n tag,\n className: el.getAttribute('class') ?? '',\n style: readComputedStyles(cs, ALL_PROPS),\n children: Object.freeze(children),\n };\n return Object.freeze(node);\n}\n\nfunction emitLeaf(\n el: HTMLElement,\n tag: string,\n cs: CSSStyleDeclaration,\n rect: DOMRect,\n effectiveHeight: number,\n isAtomic: boolean,\n ctx: InternalCtx\n): LeafNode | null {\n const w = Math.round(rect.width);\n const h = Math.round(effectiveHeight);\n\n const leafKind = classifyLeaf(tag, el, isAtomic);\n\n /* Same comprehensive capture used for containers, plus width/height inlined\n * from the rect so the placeholder claims the right space in its parent's\n * layout. Captured `display: inline` is upgraded to `inline-block` — inline\n * boxes ignore width/height, and we need both to take effect on the div\n * placeholder. */\n const captured: Record<string, string> = { ...readComputedStyles(cs, ALL_PROPS) };\n if (captured.display === 'inline') captured.display = 'inline-block';\n\n const style: CSSProperties = {\n ...captured,\n width: `${w}px`,\n height: `${h}px`,\n };\n\n let textLines: ReadonlyArray<StructuralTextLineRect> | undefined;\n if (leafKind === 'text') {\n const rawLines = captureTextLines(el, rect);\n if (rawLines && rawLines.length > 0) {\n /* `captureTextLines` returns origin-relative rects — here the origin\n * *is* the leaf box, so each rect's coordinates are already box-local.\n * Clamp to non-negative so sub-pixel rounding can't sneak a negative\n * `left` into the rendered style. */\n textLines = Object.freeze(\n rawLines.map((r) => ({\n x: Math.max(0, r.x),\n y: Math.max(0, r.y),\n w: r.w,\n h: r.h,\n }))\n );\n }\n }\n\n ctx.state.count++;\n const node: LeafNode = {\n kind: 'leaf',\n leafKind,\n className: el.getAttribute('class') ?? '',\n style: Object.freeze(style),\n textLines,\n };\n return Object.freeze(node);\n}\n\nfunction classifyLeaf(tag: string, el: HTMLElement, isAtomic: boolean): LeafKind {\n if (tag === 'img' || tag === 'picture') return 'image';\n if (tag === 'video') return 'image'; /* play-icon decorated via the renderer */\n if (isAtomic) return 'media';\n if (hasDirectText(el)) return 'text';\n /* Empty text-owner (`<p>{{ data?.price }}</p>` with null data) — classify\n * as text so the renderer falls back to a full-box bar instead of a\n * generic shimmer block. */\n if (TEXT_OWNERS.has(tag)) return 'text';\n return 'block';\n}\n","import { shallowRef, type Ref } from 'vue';\nimport type { StructuralShape } from '../types';\nimport { useShapeProbe } from './useShapeProbe';\nimport {\n clearCachedStructural,\n getCachedStructural,\n setCachedStructural,\n} from './useSkeletonCache';\nimport { walkStructural } from '../utils/walkStructural';\n\nexport interface UseSkeletonOptions {\n /**\n * Identifier for the shape cache. Pass the same key wherever the same visual\n * structure appears so the captured shape replays everywhere.\n */\n cacheKey: string;\n /**\n * Getter for the element to measure. When it returns `null` (e.g. during the\n * loading state), no measurement happens. The probe re-arms automatically\n * once the getter returns an element again.\n *\n * Typical pattern: return `null` while loading so the real content is the\n * only thing ever measured, then the cache feeds the skeleton on the next\n * load.\n */\n target?: () => HTMLElement | null;\n /** Persist to `localStorage` so first-paint after reload skips the cold start. Default false. */\n persist?: boolean;\n /** Forwarded to `walkStructural`. Default 12. */\n maxDepth?: number;\n /** Forwarded to `walkStructural`. Default 500. */\n maxNodes?: number;\n /** Forwarded to `walkStructural`. Default 4. */\n minSize?: number;\n /** Forwarded to `useShapeProbe`. Default 150 ms. */\n resizeDebounceMs?: number;\n}\n\nexport interface UseSkeletonReturn {\n /** Reactive captured shape — `undefined` on cache miss. Feed it to `<ASkeletonLayer>`. */\n shape: Readonly<Ref<StructuralShape | undefined>>;\n /**\n * Synchronously measure the current target and write to cache. Returns the\n * captured shape, or `undefined` if the target wasn't available / nothing\n * worth measuring was rendered. Use when you want to force a capture outside\n * the automatic `ResizeObserver` flow (e.g. after an animation settles).\n */\n captureNow: () => StructuralShape | undefined;\n /** Drop the cache entry for this `cacheKey`. The reactive `shape` flips to `undefined`. */\n clear: () => void;\n}\n\nconst DEFAULT_MAX_DEPTH = 12;\n\n/**\n * High-level building block for Recipe 3 — wires the structural capture +\n * cache + reactivity around a target element. The reactive `shape` is fed to\n * `<ASkeletonLayer>` which renders it in normal flow inside the consumer's\n * container.\n *\n * ```ts\n * const containerRef = ref<HTMLElement | null>(null);\n * const { shape } = useSkeleton({\n * cacheKey: 'user-card',\n * target: () => (loading.value ? null : containerRef.value),\n * });\n * ```\n *\n * ```vue\n * <div ref=\"containerRef\">\n * <ASkeletonLayer v-if=\"loading && shape\" :shape=\"shape\" />\n * <UserCard v-else :data=\"user\" />\n * </div>\n * ```\n *\n * For more control, drop down to `useShapeProbe` (pass `walkStructural` as the\n * capture strategy) + `getCachedStructural` / `setCachedStructural` and compose\n * your own orchestration.\n */\nexport function useSkeleton(options: UseSkeletonOptions): UseSkeletonReturn {\n const persist = options.persist ?? false;\n const maxDepth = options.maxDepth ?? DEFAULT_MAX_DEPTH;\n\n const shape = shallowRef<StructuralShape | undefined>(\n getCachedStructural(options.cacheKey, persist)\n );\n\n if (options.target) {\n const getTarget = options.target;\n useShapeProbe<StructuralShape>(getTarget, {\n maxDepth,\n maxNodes: options.maxNodes,\n minSize: options.minSize,\n resizeDebounceMs: options.resizeDebounceMs,\n capture: walkStructural,\n onCapture: (captured) => {\n setCachedStructural(options.cacheKey, captured, persist);\n shape.value = captured;\n },\n });\n }\n\n function captureNow(): StructuralShape | undefined {\n const el = options.target?.();\n if (!el || typeof window === 'undefined') return undefined;\n const captured = walkStructural(el, {\n maxDepth,\n maxNodes: options.maxNodes,\n minSize: options.minSize,\n });\n if (captured.width <= 0 || captured.height <= 0 || captured.nodes.length === 0)\n return undefined;\n setCachedStructural(options.cacheKey, captured, persist);\n shape.value = captured;\n return captured;\n }\n\n function clear(): void {\n clearCachedStructural(options.cacheKey);\n shape.value = undefined;\n }\n\n return { shape, captureNow, clear };\n}\n","import { Comment, Fragment, Text, type VNode } from 'vue';\n\n/**\n * Derive a default cache key from a slot's vnode tree. Returns the first\n * non-comment child's component name (or HTML tag). When the slot only contains\n * text / comments / unknown content, returns `'anonymous'` so the caller can\n * still cache, but with no useful identity — encourage an explicit `cacheKey`.\n */\nexport function fingerprintSlot(vnodes: VNode[] | undefined): string {\n if (!vnodes) return 'anonymous';\n for (const vnode of vnodes) {\n const tag = describeVNode(vnode);\n if (tag) return tag;\n }\n return 'anonymous';\n}\n\nfunction describeVNode(vnode: VNode): string | undefined {\n const t = vnode.type;\n if (t === Comment || t === Text) return undefined;\n if (t === Fragment) {\n const children = vnode.children;\n if (Array.isArray(children)) {\n for (const child of children) {\n if (child && typeof child === 'object' && 'type' in (child as object)) {\n const found = describeVNode(child as VNode);\n if (found) return found;\n }\n }\n }\n return undefined;\n }\n if (typeof t === 'string') return t;\n if (typeof t === 'object' && t !== null) {\n const named =\n (t as { name?: string }).name ??\n (t as { __name?: string }).__name ??\n (t as { displayName?: string }).displayName;\n if (named) return named;\n }\n return undefined;\n}\n"],"x_google_ignoreList":[0,1],"mappings":"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"}