{
  "version": 3,
  "sources": ["../src/runtime.ts", "../src/utils/mergeStyles.ts", "../src/parser/aspectRatio.ts", "../src/config/tailwind.ts", "../src/utils/flattenColors.ts", "../src/utils/colorUtils.ts", "../src/parser/colors.ts", "../src/parser/borders.ts", "../src/parser/layout.ts", "../src/parser/outline.ts", "../src/parser/shadows.ts", "../src/config/markers.ts", "../src/parser/sizing.ts", "../src/parser/spacing.ts", "../src/parser/transforms.ts", "../src/parser/typography.ts", "../src/parser/modifiers.ts", "../src/parser/index.ts", "../src/utils/modifiers.ts"],
  "sourcesContent": ["import type { CustomTheme } from \"./parser/index.js\";\nimport { parseClassName } from \"./parser/index.js\";\nimport type { NativeStyle, TwStyle } from \"./types/runtime.js\";\nimport { flattenColors } from \"./utils/flattenColors.js\";\nimport { hasModifiers, splitModifierClasses } from \"./utils/modifiers.js\";\n\n/**\n * Runtime configuration type matching Tailwind config structure\n */\nexport type RuntimeConfig = {\n  theme?: {\n    extend?: {\n      colors?: Record<string, string | Record<string, string>>;\n      fontFamily?: Record<string, string | string[]>;\n      fontSize?: Record<string, string | number>;\n      spacing?: Record<string, string | number>;\n    };\n  };\n};\n\n// Global custom theme configuration\nconst globalCustomTheme: CustomTheme = {\n  colors: {},\n  fontFamily: {},\n  fontSize: {},\n  spacing: {},\n};\n\n// Simple memoization cache\nconst styleCache = new Map<string, TwStyle>();\n\n/**\n * Configure runtime Tailwind settings\n * Matches the structure of tailwind.config.mjs for consistency\n *\n * @param config - Runtime configuration object\n *\n * @example\n * ```typescript\n * import { setConfig } from '@mgcrea/react-native-tailwind/runtime';\n *\n * setConfig({\n *   theme: {\n *     extend: {\n *       colors: {\n *         primary: '#007AFF',\n *         secondary: '#5856D6',\n *         brand: {\n *           light: '#FF6B6B',\n *           dark: '#CC0000'\n *         }\n *       }\n *     }\n *   }\n * });\n * ```\n */\nexport function setConfig(config: RuntimeConfig): void {\n  // Extract and flatten custom colors\n  if (config.theme?.extend?.colors) {\n    globalCustomTheme.colors = flattenColors(config.theme?.extend.colors);\n  } else {\n    globalCustomTheme.colors = {};\n  }\n\n  // Extract custom fontFamily\n  if (config.theme?.extend?.fontFamily) {\n    const fontFamilyResult: Record<string, string> = {};\n    for (const [key, value] of Object.entries(config.theme.extend.fontFamily)) {\n      if (Array.isArray(value)) {\n        // Take first font in the array (React Native doesn't support font stacks)\n        fontFamilyResult[key] = value[0];\n      } else {\n        fontFamilyResult[key] = value;\n      }\n    }\n    globalCustomTheme.fontFamily = fontFamilyResult;\n  } else {\n    globalCustomTheme.fontFamily = {};\n  }\n\n  // Extract custom fontSize\n  if (config.theme?.extend?.fontSize) {\n    const fontSizeResult: Record<string, number> = {};\n    for (const [key, value] of Object.entries(config.theme.extend.fontSize)) {\n      if (typeof value === \"number\") {\n        fontSizeResult[key] = value;\n      } else if (typeof value === \"string\") {\n        // Parse string values like \"18px\" or \"18\" to number\n        const parsed = parseFloat(value.replace(/px$/, \"\"));\n        if (!isNaN(parsed)) {\n          fontSizeResult[key] = parsed;\n        }\n      }\n    }\n    globalCustomTheme.fontSize = fontSizeResult;\n  } else {\n    globalCustomTheme.fontSize = {};\n  }\n\n  // Extract custom spacing\n  if (config.theme?.extend?.spacing) {\n    const spacingResult: Record<string, number> = {};\n    for (const [key, value] of Object.entries(config.theme.extend.spacing)) {\n      if (typeof value === \"number\") {\n        spacingResult[key] = value;\n      } else if (typeof value === \"string\") {\n        // Parse string values: \"18rem\" -> 288, \"16px\" -> 16, \"16\" -> 16\n        let parsed: number;\n        if (value.endsWith(\"rem\")) {\n          // Convert rem to px (1rem = 16px)\n          parsed = parseFloat(value.replace(/rem$/, \"\")) * 16;\n        } else {\n          // Parse px or unitless values\n          parsed = parseFloat(value.replace(/px$/, \"\"));\n        }\n        if (!isNaN(parsed)) {\n          spacingResult[key] = parsed;\n        }\n      }\n    }\n    globalCustomTheme.spacing = spacingResult;\n  } else {\n    globalCustomTheme.spacing = {};\n  }\n\n  // Clear cache when config changes\n  styleCache.clear();\n}\n\n/**\n * Get currently configured custom theme\n */\nexport function getCustomTheme(): CustomTheme {\n  return globalCustomTheme;\n}\n\n/**\n * Get currently configured custom colors (for backwards compatibility)\n * @deprecated Use getCustomTheme() instead\n */\nexport function getCustomColors(): Record<string, string> | undefined {\n  return Object.keys(globalCustomTheme.colors ?? {}).length > 0 ? globalCustomTheme.colors : undefined;\n}\n\n/**\n * Clear the memoization cache\n * Useful for testing or when you want to force re-parsing\n */\nexport function clearCache(): void {\n  styleCache.clear();\n}\n\n/**\n * Get cache statistics (for debugging/monitoring)\n */\nexport function getCacheStats(): { size: number; keys: string[] } {\n  return {\n    size: styleCache.size,\n    keys: Array.from(styleCache.keys()),\n  };\n}\n\n/**\n * Parse className string and return a TwStyle object with separate modifier properties\n * Internal helper that handles caching and StyleSheet.create wrapping\n */\nfunction parseAndCache(className: string): TwStyle {\n  // Check cache first\n  const cached = styleCache.get(className);\n  if (cached) {\n    return cached;\n  }\n\n  // Check if className contains modifiers\n  if (!hasModifiers(className)) {\n    // No modifiers - simple case\n    const styleObject = parseClassName(className, globalCustomTheme);\n\n    const result: TwStyle = {\n      // @ts-expect-error - StyleObject transform types are broader than React Native's strict types\n      style: styleObject,\n    };\n\n    // Cache the result\n    styleCache.set(className, result);\n\n    return result;\n  }\n\n  // Has modifiers - split and parse separately\n  const { base, modifiers } = splitModifierClasses(className);\n\n  // Parse base styles\n  const baseClassName = base.join(\" \");\n  const baseStyle = baseClassName ? parseClassName(baseClassName, globalCustomTheme) : {};\n\n  // Build result object\n  const result: TwStyle = {\n    // @ts-expect-error - StyleObject transform types are broader than React Native's strict types\n    style: baseStyle,\n  };\n\n  // Parse and add modifier styles\n  if (modifiers.has(\"active\")) {\n    const activeClasses = modifiers.get(\"active\");\n    if (activeClasses && activeClasses.length > 0) {\n      const activeClassName = activeClasses.join(\" \");\n      // @ts-expect-error - StyleObject transform types are broader than React Native's strict types\n      result.activeStyle = parseClassName(activeClassName, globalCustomTheme);\n    }\n  }\n\n  if (modifiers.has(\"focus\")) {\n    const focusClasses = modifiers.get(\"focus\");\n    if (focusClasses && focusClasses.length > 0) {\n      const focusClassName = focusClasses.join(\" \");\n      // @ts-expect-error - StyleObject transform types are broader than React Native's strict types\n      result.focusStyle = parseClassName(focusClassName, globalCustomTheme);\n    }\n  }\n\n  if (modifiers.has(\"disabled\")) {\n    const disabledClasses = modifiers.get(\"disabled\");\n    if (disabledClasses && disabledClasses.length > 0) {\n      const disabledClassName = disabledClasses.join(\" \");\n      // @ts-expect-error - StyleObject transform types are broader than React Native's strict types\n      result.disabledStyle = parseClassName(disabledClassName, globalCustomTheme);\n    }\n  }\n\n  // Cache the result\n  styleCache.set(className, result);\n\n  return result;\n}\n\n/**\n * Runtime Tailwind CSS template tag for React Native\n *\n * Parses Tailwind class names at runtime and returns a TwStyle object with separate\n * properties for base styles and modifier styles (active, focus, disabled).\n * Results are memoized for performance.\n *\n * @param strings - Template string parts\n * @param values - Interpolated values\n * @returns TwStyle object with style, activeStyle, focusStyle, and disabledStyle properties\n *\n * @example\n * ```tsx\n * import { tw } from '@mgcrea/react-native-tailwind/runtime';\n *\n * // Simple usage - access .style property\n * <View style={tw`m-4 p-2 bg-blue-500`.style} />\n *\n * // With interpolations\n * <View style={tw`flex-1 ${isActive && 'bg-blue-500'} p-4`.style} />\n *\n * // With state modifiers - access activeStyle/focusStyle for animations\n * const styles = tw`bg-blue-500 active:bg-blue-700 focus:bg-blue-800`;\n * <Pressable style={(state) => [\n *   styles.style,\n *   state.pressed && styles.activeStyle,\n *   state.focused && styles.focusStyle\n * ]}>\n *   <Text>Press me</Text>\n * </Pressable>\n *\n * // Use with reanimated for animations with raw values\n * const styles = tw`bg-blue-500 active:bg-blue-700`;\n * const animatedStyles = useAnimatedStyle(() => ({\n *   ...styles.style,\n *   backgroundColor: interpolateColor(\n *     progress.value,\n *     [0, 1],\n *     [styles.style.backgroundColor, styles.activeStyle?.backgroundColor]\n *   )\n * }));\n * ```\n */\nexport function tw<T extends NativeStyle = NativeStyle>(\n  strings: TemplateStringsArray,\n  ...values: unknown[]\n): TwStyle<T> {\n  // Combine template strings and values into a single className string\n  const className = strings.reduce((acc, str, i) => {\n    const value = values[i];\n    // Handle falsy values (false, null, undefined) - don't add them\n    // Note: 0 and empty string are preserved as they may be valid values\n    // eslint-disable-next-line @typescript-eslint/no-base-to-string\n    const valueStr = value != null && value !== false ? String(value) : \"\";\n    return acc + str + valueStr;\n  }, \"\");\n\n  // Trim and normalize whitespace\n  const normalizedClassName = className.trim().replace(/\\s+/g, \" \");\n\n  // Handle empty className\n  if (!normalizedClassName) {\n    return { style: {} as T };\n  }\n\n  return parseAndCache(normalizedClassName) as TwStyle<T>;\n}\n\n/**\n * String version of tw for cases where template literals aren't needed\n *\n * Parses Tailwind class names at runtime and returns a TwStyle object with separate\n * properties for base styles and modifier styles (active, focus, disabled).\n *\n * @param className - Space-separated Tailwind class names\n * @returns TwStyle object with style, activeStyle, focusStyle, and disabledStyle properties\n *\n * @example\n * ```tsx\n * import { twStyle } from '@mgcrea/react-native-tailwind/runtime';\n *\n * // Simple usage - access .style property\n * <View style={twStyle('m-4 p-2 bg-blue-500').style} />\n *\n * // With state modifiers\n * const styles = twStyle('bg-blue-500 active:bg-blue-700 focus:bg-blue-800');\n * <Pressable style={(state) => [\n *   styles.style,\n *   state.pressed && styles.activeStyle,\n *   state.focused && styles.focusStyle\n * ]}>\n *   <Text>Press me</Text>\n * </Pressable>\n * ```\n */\nexport function twStyle<T extends NativeStyle = NativeStyle>(className: string): TwStyle<T> | undefined {\n  const normalizedClassName = className.trim().replace(/\\s+/g, \" \");\n\n  if (!normalizedClassName) {\n    return undefined;\n  }\n\n  return parseAndCache(normalizedClassName) as TwStyle<T>;\n}\n", "/**\n * Smart merge utility for StyleObject values\n * Handles transform arrays with \"last wins\" semantics for same transform types\n */\n\nimport type { StyleObject, TransformStyle } from \"../types/core\";\n\n/**\n * Get the transform type key from a transform object\n * e.g., { rotate: '45deg' } -> 'rotate', { scale: 1.1 } -> 'scale'\n */\nfunction getTransformType(transform: TransformStyle): string {\n  return Object.keys(transform)[0];\n}\n\n/**\n * Merge transform arrays with \"last wins\" semantics for duplicate transform types.\n * Different transform types are combined, but if the same type appears twice,\n * the later one replaces the earlier one (matching Tailwind CSS behavior).\n *\n * @example\n * // Different types are combined\n * mergeTransforms([{ rotate: '45deg' }], [{ scale: 1.1 }])\n * // => [{ rotate: '45deg' }, { scale: 1.1 }]\n *\n * @example\n * // Same type: last wins\n * mergeTransforms([{ rotate: '45deg' }], [{ rotate: '90deg' }])\n * // => [{ rotate: '90deg' }]\n */\nfunction mergeTransforms(target: TransformStyle[], source: TransformStyle[]): TransformStyle[] {\n  // Build result by processing target first, then source\n  // For each source transform, replace any existing transform of the same type\n  const result: TransformStyle[] = [...target];\n\n  for (const sourceTransform of source) {\n    const sourceType = getTransformType(sourceTransform);\n    const existingIndex = result.findIndex((t) => getTransformType(t) === sourceType);\n\n    if (existingIndex !== -1) {\n      // Replace existing transform of same type (last wins)\n      result[existingIndex] = sourceTransform;\n    } else {\n      // Add new transform type\n      result.push(sourceTransform);\n    }\n  }\n\n  return result;\n}\n\n/**\n * Merge two StyleObject instances, handling transform arrays specially\n *\n * @param target - The target object to merge into (mutated)\n * @param source - The source object to merge from\n * @returns The merged target object\n *\n * @example\n * // Standard properties are overwritten (like Object.assign)\n * mergeStyles({ margin: 4 }, { padding: 8 })\n * // => { margin: 4, padding: 8 }\n *\n * @example\n * // Different transform types are combined\n * mergeStyles(\n *   { transform: [{ rotate: '45deg' }] },\n *   { transform: [{ scale: 1.1 }] }\n * )\n * // => { transform: [{ rotate: '45deg' }, { scale: 1.1 }] }\n *\n * @example\n * // Same transform type: last wins (Tailwind parity)\n * mergeStyles(\n *   { transform: [{ rotate: '45deg' }] },\n *   { transform: [{ rotate: '90deg' }] }\n * )\n * // => { transform: [{ rotate: '90deg' }] }\n */\nexport function mergeStyles(target: StyleObject, source: StyleObject): StyleObject {\n  for (const key in source) {\n    if (Object.prototype.hasOwnProperty.call(source, key)) {\n      const sourceValue = source[key];\n\n      // Handle transform arrays specially\n      if (key === \"transform\" && Array.isArray(sourceValue)) {\n        const targetValue = target[key];\n        if (Array.isArray(targetValue)) {\n          // Merge transforms with \"last wins\" for same types\n          target.transform = mergeTransforms(targetValue, sourceValue);\n        } else {\n          // No existing array, just assign\n          target[key] = sourceValue;\n        }\n      } else {\n        // Standard Object.assign behavior for non-transform properties\n        target[key] = sourceValue;\n      }\n    }\n  }\n\n  return target;\n}\n", "/**\n * Aspect ratio utilities for React Native\n * Uses aspectRatio style property (React Native 0.71+)\n */\n\nimport type { StyleObject } from \"../types\";\n\n/**\n * Preset aspect ratios\n */\nconst ASPECT_RATIO_PRESETS: Record<string, number | undefined> = {\n  \"aspect-auto\": undefined, // Remove aspect ratio\n  \"aspect-square\": 1, // 1:1\n  \"aspect-video\": 16 / 9, // 16:9\n};\n\n/**\n * Parse arbitrary aspect ratio value: aspect-[4/3]\n * @param value - Arbitrary value string (e.g., \"[4/3]\", \"[16/9]\")\n * @returns Aspect ratio number or null\n */\nfunction parseArbitraryAspectRatio(value: string): number | null {\n  const match = value.match(/^\\[(\\d+)\\/(\\d+)\\]$/);\n  if (match) {\n    const numerator = Number.parseInt(match[1], 10);\n    const denominator = Number.parseInt(match[2], 10);\n\n    if (denominator === 0) {\n      /* v8 ignore next 3 */\n      if (process.env.NODE_ENV !== \"production\") {\n        console.warn(`[react-native-tailwind] Invalid aspect ratio: ${value}. Denominator cannot be zero.`);\n      }\n      return null;\n    }\n\n    return numerator / denominator;\n  }\n\n  return null;\n}\n\n/**\n * Parse aspect ratio classes\n * @param cls - Class name to parse\n * @returns Style object or null if not an aspect ratio class\n */\nexport function parseAspectRatio(cls: string): StyleObject | null {\n  if (!cls.startsWith(\"aspect-\")) {\n    return null;\n  }\n\n  // Check for preset values\n  if (cls in ASPECT_RATIO_PRESETS) {\n    const aspectRatio = ASPECT_RATIO_PRESETS[cls];\n    // aspect-auto removes the aspect ratio constraint by explicitly setting to undefined\n    // This ensures it overrides any previously set aspectRatio in Object.assign\n    if (aspectRatio === undefined) {\n      return { aspectRatio: undefined };\n    }\n    return { aspectRatio };\n  }\n\n  // Check for arbitrary values: aspect-[4/3]\n  const arbitraryValue = cls.substring(7); // Remove \"aspect-\"\n  const aspectRatio = parseArbitraryAspectRatio(arbitraryValue);\n  if (aspectRatio !== null) {\n    return { aspectRatio };\n  }\n\n  return null;\n}\n\n// Export presets for testing/advanced usage\nexport { ASPECT_RATIO_PRESETS };\n", "export type TailwindPalette = {\n  \"50\": string;\n  \"100\": string;\n  \"200\": string;\n  \"300\": string;\n  \"400\": string;\n  \"500\": string;\n  \"600\": string;\n  \"700\": string;\n  \"800\": string;\n  \"900\": string;\n  \"950\": string;\n};\n\nexport const TAILWIND_COLORS = {\n  red: {\n    \"50\": \"#fef2f2\",\n    \"100\": \"#ffe2e2\",\n    \"200\": \"#ffc9c9\",\n    \"300\": \"#ffa2a2\",\n    \"400\": \"#ff6467\",\n    \"500\": \"#fb2c36\",\n    \"600\": \"#e7000b\",\n    \"700\": \"#c10007\",\n    \"800\": \"#9f0712\",\n    \"900\": \"#82181a\",\n    \"950\": \"#460809\",\n  },\n  orange: {\n    \"50\": \"#fff7ed\",\n    \"100\": \"#ffedd4\",\n    \"200\": \"#ffd6a7\",\n    \"300\": \"#ffb86a\",\n    \"400\": \"#ff8904\",\n    \"500\": \"#ff6900\",\n    \"600\": \"#f54900\",\n    \"700\": \"#ca3500\",\n    \"800\": \"#9f2d00\",\n    \"900\": \"#7e2a0c\",\n    \"950\": \"#441306\",\n  },\n  amber: {\n    \"50\": \"#fffbeb\",\n    \"100\": \"#fef3c6\",\n    \"200\": \"#fee685\",\n    \"300\": \"#ffd230\",\n    \"400\": \"#ffb900\",\n    \"500\": \"#fe9a00\",\n    \"600\": \"#e17100\",\n    \"700\": \"#bb4d00\",\n    \"800\": \"#973c00\",\n    \"900\": \"#7b3306\",\n    \"950\": \"#461901\",\n  },\n  yellow: {\n    \"50\": \"#fefce8\",\n    \"100\": \"#fef9c2\",\n    \"200\": \"#fff085\",\n    \"300\": \"#ffdf20\",\n    \"400\": \"#fdc700\",\n    \"500\": \"#f0b100\",\n    \"600\": \"#d08700\",\n    \"700\": \"#a65f00\",\n    \"800\": \"#894b00\",\n    \"900\": \"#733e0a\",\n    \"950\": \"#432004\",\n  },\n  lime: {\n    \"50\": \"#f7fee7\",\n    \"100\": \"#ecfcca\",\n    \"200\": \"#d8f999\",\n    \"300\": \"#bbf451\",\n    \"400\": \"#9ae600\",\n    \"500\": \"#7ccf00\",\n    \"600\": \"#5ea500\",\n    \"700\": \"#497d00\",\n    \"800\": \"#3c6300\",\n    \"900\": \"#35530e\",\n    \"950\": \"#192e03\",\n  },\n  green: {\n    \"50\": \"#f0fdf4\",\n    \"100\": \"#dcfce7\",\n    \"200\": \"#b9f8cf\",\n    \"300\": \"#7bf1a8\",\n    \"400\": \"#05df72\",\n    \"500\": \"#00c950\",\n    \"600\": \"#00a63e\",\n    \"700\": \"#008236\",\n    \"800\": \"#016630\",\n    \"900\": \"#0d542b\",\n    \"950\": \"#032e15\",\n  },\n  emerald: {\n    \"50\": \"#ecfdf5\",\n    \"100\": \"#d0fae5\",\n    \"200\": \"#a4f4cf\",\n    \"300\": \"#5ee9b5\",\n    \"400\": \"#00d492\",\n    \"500\": \"#00bc7d\",\n    \"600\": \"#009966\",\n    \"700\": \"#007a55\",\n    \"800\": \"#006045\",\n    \"900\": \"#004f3b\",\n    \"950\": \"#002c22\",\n  },\n  teal: {\n    \"50\": \"#f0fdfa\",\n    \"100\": \"#cbfbf1\",\n    \"200\": \"#96f7e4\",\n    \"300\": \"#46ecd5\",\n    \"400\": \"#00d5be\",\n    \"500\": \"#00bba7\",\n    \"600\": \"#009689\",\n    \"700\": \"#00786f\",\n    \"800\": \"#005f5a\",\n    \"900\": \"#0b4f4a\",\n    \"950\": \"#022f2e\",\n  },\n  cyan: {\n    \"50\": \"#ecfeff\",\n    \"100\": \"#cefafe\",\n    \"200\": \"#a2f4fd\",\n    \"300\": \"#53eafd\",\n    \"400\": \"#00d3f2\",\n    \"500\": \"#00b8db\",\n    \"600\": \"#0092b8\",\n    \"700\": \"#007595\",\n    \"800\": \"#005f78\",\n    \"900\": \"#104e64\",\n    \"950\": \"#053345\",\n  },\n  sky: {\n    \"50\": \"#f0f9ff\",\n    \"100\": \"#dff2fe\",\n    \"200\": \"#b8e6fe\",\n    \"300\": \"#74d4ff\",\n    \"400\": \"#00bcff\",\n    \"500\": \"#00a6f4\",\n    \"600\": \"#0084d1\",\n    \"700\": \"#0069a8\",\n    \"800\": \"#00598a\",\n    \"900\": \"#024a70\",\n    \"950\": \"#052f4a\",\n  },\n  blue: {\n    \"50\": \"#eff6ff\",\n    \"100\": \"#dbeafe\",\n    \"200\": \"#bedbff\",\n    \"300\": \"#8ec5ff\",\n    \"400\": \"#51a2ff\",\n    \"500\": \"#2b7fff\",\n    \"600\": \"#155dfc\",\n    \"700\": \"#1447e6\",\n    \"800\": \"#193cb8\",\n    \"900\": \"#1c398e\",\n    \"950\": \"#162456\",\n  },\n  indigo: {\n    \"50\": \"#eef2ff\",\n    \"100\": \"#e0e7ff\",\n    \"200\": \"#c6d2ff\",\n    \"300\": \"#a3b3ff\",\n    \"400\": \"#7c86ff\",\n    \"500\": \"#615fff\",\n    \"600\": \"#4f39f6\",\n    \"700\": \"#432dd7\",\n    \"800\": \"#372aac\",\n    \"900\": \"#312c85\",\n    \"950\": \"#1e1a4d\",\n  },\n  violet: {\n    \"50\": \"#f5f3ff\",\n    \"100\": \"#ede9fe\",\n    \"200\": \"#ddd6ff\",\n    \"300\": \"#c4b4ff\",\n    \"400\": \"#a684ff\",\n    \"500\": \"#8e51ff\",\n    \"600\": \"#7f22fe\",\n    \"700\": \"#7008e7\",\n    \"800\": \"#5d0ec0\",\n    \"900\": \"#4d179a\",\n    \"950\": \"#2f0d68\",\n  },\n  purple: {\n    \"50\": \"#faf5ff\",\n    \"100\": \"#f3e8ff\",\n    \"200\": \"#e9d4ff\",\n    \"300\": \"#dab2ff\",\n    \"400\": \"#c27aff\",\n    \"500\": \"#ad46ff\",\n    \"600\": \"#9810fa\",\n    \"700\": \"#8200db\",\n    \"800\": \"#6e11b0\",\n    \"900\": \"#59168b\",\n    \"950\": \"#3c0366\",\n  },\n  fuchsia: {\n    \"50\": \"#fdf4ff\",\n    \"100\": \"#fae8ff\",\n    \"200\": \"#f6cfff\",\n    \"300\": \"#f4a8ff\",\n    \"400\": \"#ed6aff\",\n    \"500\": \"#e12afb\",\n    \"600\": \"#c800de\",\n    \"700\": \"#a800b7\",\n    \"800\": \"#8a0194\",\n    \"900\": \"#721378\",\n    \"950\": \"#4b004f\",\n  },\n  pink: {\n    \"50\": \"#fdf2f8\",\n    \"100\": \"#fce7f3\",\n    \"200\": \"#fccee8\",\n    \"300\": \"#fda5d5\",\n    \"400\": \"#fb64b6\",\n    \"500\": \"#f6339a\",\n    \"600\": \"#e60076\",\n    \"700\": \"#c6005c\",\n    \"800\": \"#a3004c\",\n    \"900\": \"#861043\",\n    \"950\": \"#510424\",\n  },\n  rose: {\n    \"50\": \"#fff1f2\",\n    \"100\": \"#ffe4e6\",\n    \"200\": \"#ffccd3\",\n    \"300\": \"#ffa1ad\",\n    \"400\": \"#ff637e\",\n    \"500\": \"#ff2056\",\n    \"600\": \"#ec003f\",\n    \"700\": \"#c70036\",\n    \"800\": \"#a50036\",\n    \"900\": \"#8b0836\",\n    \"950\": \"#4d0218\",\n  },\n  slate: {\n    \"50\": \"#f8fafc\",\n    \"100\": \"#f1f5f9\",\n    \"200\": \"#e2e8f0\",\n    \"300\": \"#cad5e2\",\n    \"400\": \"#90a1b9\",\n    \"500\": \"#62748e\",\n    \"600\": \"#45556c\",\n    \"700\": \"#314158\",\n    \"800\": \"#1d293d\",\n    \"900\": \"#0f172b\",\n    \"950\": \"#020618\",\n  },\n  gray: {\n    \"50\": \"#f9fafb\",\n    \"100\": \"#f3f4f6\",\n    \"200\": \"#e5e7eb\",\n    \"300\": \"#d1d5dc\",\n    \"400\": \"#99a1af\",\n    \"500\": \"#6a7282\",\n    \"600\": \"#4a5565\",\n    \"700\": \"#364153\",\n    \"800\": \"#1e2939\",\n    \"900\": \"#101828\",\n    \"950\": \"#030712\",\n  },\n  zinc: {\n    \"50\": \"#fafafa\",\n    \"100\": \"#f4f4f5\",\n    \"200\": \"#e4e4e7\",\n    \"300\": \"#d4d4d8\",\n    \"400\": \"#9f9fa9\",\n    \"500\": \"#71717b\",\n    \"600\": \"#52525c\",\n    \"700\": \"#3f3f46\",\n    \"800\": \"#27272a\",\n    \"900\": \"#18181b\",\n    \"950\": \"#09090b\",\n  },\n  neutral: {\n    \"50\": \"#fafafa\",\n    \"100\": \"#f5f5f5\",\n    \"200\": \"#e5e5e5\",\n    \"300\": \"#d4d4d4\",\n    \"400\": \"#a1a1a1\",\n    \"500\": \"#737373\",\n    \"600\": \"#525252\",\n    \"700\": \"#404040\",\n    \"800\": \"#262626\",\n    \"900\": \"#171717\",\n    \"950\": \"#0a0a0a\",\n  },\n  stone: {\n    \"50\": \"#fafaf9\",\n    \"100\": \"#f5f5f4\",\n    \"200\": \"#e7e5e4\",\n    \"300\": \"#d6d3d1\",\n    \"400\": \"#a6a09b\",\n    \"500\": \"#79716b\",\n    \"600\": \"#57534d\",\n    \"700\": \"#44403b\",\n    \"800\": \"#292524\",\n    \"900\": \"#1c1917\",\n    \"950\": \"#0c0a09\",\n  },\n} satisfies Record<string, TailwindPalette>;\n\nexport type TailwindColor = keyof typeof TAILWIND_COLORS;\n", "/**\n * Type representing a nested color structure that can be arbitrarily deep\n */\ntype NestedColors = {\n  [key: string]: string | NestedColors;\n};\n\n/**\n * Flatten nested color objects into flat key-value map\n * Example: { brand: { light: '#fff', dark: '#000' } } => { 'brand-light': '#fff', 'brand-dark': '#000' }\n * Special handling for DEFAULT: { primary: { DEFAULT: '#000', 500: '#333' } } => { 'primary': '#000', 'primary-500': '#333' }\n *\n * @param colors - Nested color object where values can be strings or objects\n * @param prefix - Optional prefix for nested keys (used for recursion)\n * @returns Flattened color map with dash-separated keys\n */\nexport function flattenColors(colors: NestedColors, prefix = \"\"): Record<string, string> {\n  const result: Record<string, string> = {};\n\n  for (const [key, value] of Object.entries(colors)) {\n    // Special handling for DEFAULT key - use parent key without suffix\n    const newKey = key === \"DEFAULT\" && prefix ? prefix : prefix ? `${prefix}-${key}` : key;\n\n    if (typeof value === \"string\") {\n      result[newKey] = value;\n    } else if (typeof value === \"object\" && value !== null) {\n      // Recursively flatten nested objects\n      // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n      Object.assign(result, flattenColors(value as NestedColors, newKey));\n    }\n  }\n\n  return result;\n}\n", "/**\n * Shared color utilities for parsing and manipulating colors\n */\n\nimport { TAILWIND_COLORS } from \"../config/tailwind\";\nimport { flattenColors } from \"./flattenColors\";\n\n/**\n * Tailwind color palette (flattened from config) with basic colors\n */\nexport const COLORS: Record<string, string> = {\n  ...flattenColors(TAILWIND_COLORS),\n  white: \"#FFFFFF\",\n  black: \"#000000\",\n  transparent: \"transparent\",\n};\n\n/**\n * Apply opacity to hex color by appending alpha channel\n * @param hex - Hex color string (e.g., \"#ff0000\", \"#f00\", or \"transparent\")\n * @param opacity - Opacity value 0-100 (e.g., 50 for 50%)\n * @returns 8-digit hex with alpha (e.g., \"#FF000080\") or transparent\n */\nexport function applyOpacity(hex: string, opacity: number): string {\n  if (hex === \"transparent\") {\n    return \"transparent\";\n  }\n\n  const cleanHex = hex.replace(/^#/, \"\");\n  const fullHex =\n    cleanHex.length === 3\n      ? cleanHex\n          .split(\"\")\n          .map((char) => char + char)\n          .join(\"\")\n      : cleanHex;\n\n  const alpha = Math.round((opacity / 100) * 255);\n  const alphaHex = alpha.toString(16).padStart(2, \"0\").toUpperCase();\n\n  return `#${fullHex.toUpperCase()}${alphaHex}`;\n}\n\n/**\n * Parse arbitrary color value: [#ff0000], [#f00], [#FF0000AA]\n * Supports 3-digit, 6-digit, and 8-digit (with alpha) hex colors\n * @param value - Arbitrary value string like \"[#ff0000]\"\n * @returns Hex string if valid, null otherwise (preserves input case)\n */\nexport function parseArbitraryColor(value: string): string | null {\n  const hexMatch = value.match(/^\\[#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})\\]$/);\n  if (hexMatch) {\n    const hex = hexMatch[1];\n    if (hex.length === 3) {\n      // Expand 3-digit hex to 6-digit: #abc -> #aabbcc (preserve case)\n      const expanded = hex\n        .split(\"\")\n        .map((char) => char + char)\n        .join(\"\");\n      return `#${expanded}`;\n    }\n    return `#${hex}`;\n  }\n  return null;\n}\n\n/**\n * Parse a color value with optional opacity modifier\n * Handles preset colors, custom colors, arbitrary hex values, and opacity modifiers\n *\n * @param colorKey - Color key like \"red-500\", \"red-500/50\", \"[#ff0000]\", \"[#ff0000]/80\"\n * @param customColors - Optional custom colors from tailwind.config\n * @returns Hex color string or null if invalid\n */\nexport function parseColorValue(colorKey: string, customColors?: Record<string, string>): string | null {\n  const getColor = (key: string): string | undefined => {\n    return customColors?.[key] ?? COLORS[key];\n  };\n\n  // Check for opacity modifier: red-500/50, [#ff0000]/80\n  const opacityMatch = colorKey.match(/^(.+)\\/(\\d+)$/);\n  if (opacityMatch) {\n    const baseColorKey = opacityMatch[1];\n    const opacity = Number.parseInt(opacityMatch[2], 10);\n\n    // Validate opacity range (0-100)\n    if (opacity < 0 || opacity > 100) {\n      return null;\n    }\n\n    // Try arbitrary color first: [#ff0000]/50\n    const arbitraryColor = parseArbitraryColor(baseColorKey);\n    if (arbitraryColor !== null) {\n      return applyOpacity(arbitraryColor, opacity);\n    }\n\n    // Try preset/custom colors: red-500/50\n    const color = getColor(baseColorKey);\n    if (color) {\n      return applyOpacity(color, opacity);\n    }\n\n    return null;\n  }\n\n  // No opacity modifier\n  // Try arbitrary value first: [#ff0000]\n  const arbitraryColor = parseArbitraryColor(colorKey);\n  if (arbitraryColor !== null) {\n    return arbitraryColor;\n  }\n\n  // Try preset/custom colors: red-500\n  return getColor(colorKey) ?? null;\n}\n", "/**\n * Color utilities (background, text, border colors)\n */\n\nimport type { StyleObject } from \"../types\";\nimport { COLORS, applyOpacity, parseArbitraryColor } from \"../utils/colorUtils\";\n\n// Re-export COLORS for backward compatibility and tests\nexport { COLORS };\n\n/**\n * Parse color classes (background, text, border)\n * Supports opacity modifier: bg-blue-500/50, text-black/80, border-red-500/30\n */\nexport function parseColor(cls: string, customColors?: Record<string, string>): StyleObject | null {\n  // Helper to get color with custom override (custom colors take precedence)\n  const getColor = (key: string): string | undefined => {\n    return customColors?.[key] ?? COLORS[key];\n  };\n\n  // Helper to parse color with optional opacity modifier\n  // Uses internal implementation to preserve warnings for invalid arbitrary colors\n  const parseColorWithOpacity = (colorKey: string): string | null => {\n    // Check for opacity modifier: blue-500/50\n    const opacityMatch = colorKey.match(/^(.+)\\/(\\d+)$/);\n    if (opacityMatch) {\n      const baseColorKey = opacityMatch[1];\n      const opacity = Number.parseInt(opacityMatch[2], 10);\n\n      // Validate opacity range (0-100)\n      if (opacity < 0 || opacity > 100) {\n        /* v8 ignore next 5 */\n        if (process.env.NODE_ENV !== \"production\") {\n          console.warn(\n            `[react-native-tailwind] Invalid opacity value: ${opacity}. Opacity must be between 0 and 100.`,\n          );\n        }\n        return null;\n      }\n\n      // Try arbitrary color first: bg-[#ff0000]/50\n      const arbitraryColor = parseArbitraryColor(baseColorKey);\n      if (arbitraryColor !== null) {\n        return applyOpacity(arbitraryColor, opacity);\n      }\n\n      // Try preset/custom colors: bg-blue-500/50\n      const color = getColor(baseColorKey);\n      if (color) {\n        return applyOpacity(color, opacity);\n      }\n\n      return null;\n    }\n\n    // No opacity modifier - try normal color parsing\n    // Try arbitrary value first\n    const arbitraryColor = parseArbitraryColor(colorKey);\n    if (arbitraryColor !== null) {\n      return arbitraryColor;\n    }\n\n    // Check for unsupported arbitrary format and warn\n    if (colorKey.startsWith(\"[\") && colorKey.endsWith(\"]\")) {\n      /* v8 ignore next 5 */\n      if (process.env.NODE_ENV !== \"production\") {\n        console.warn(\n          `[react-native-tailwind] Unsupported arbitrary color value: ${colorKey}. Only hex colors are supported (e.g., [#ff0000], [#f00], or [#ff0000aa]).`,\n        );\n      }\n      return null;\n    }\n\n    // Try preset/custom colors\n    return getColor(colorKey) ?? null;\n  };\n\n  // Background color: bg-blue-500, bg-blue-500/50, bg-[#ff0000]/80\n  // Only parse arbitrary values that look like colors (start with #)\n  if (cls.startsWith(\"bg-\")) {\n    const colorKey = cls.substring(3);\n    // Skip arbitrary values that don't look like colors (e.g., bg-[100%] is sizing)\n    if (colorKey.startsWith(\"[\") && !colorKey.startsWith(\"[#\")) {\n      return null;\n    }\n    const color = parseColorWithOpacity(colorKey);\n    if (color) {\n      return { backgroundColor: color };\n    }\n  }\n\n  // Text color: text-blue-500, text-blue-500/50, text-[#ff0000]/80\n  // Only parse arbitrary values that look like colors (start with #)\n  if (cls.startsWith(\"text-\")) {\n    const colorKey = cls.substring(5);\n    // Skip arbitrary values that don't look like colors (e.g., text-[13px] is font size)\n    if (colorKey.startsWith(\"[\") && !colorKey.startsWith(\"[#\")) {\n      return null;\n    }\n    const color = parseColorWithOpacity(colorKey);\n    if (color) {\n      return { color: color };\n    }\n  }\n\n  // Border color: border-blue-500, border-blue-500/50, border-[#ff0000]/80\n  if (cls.startsWith(\"border-\") && !cls.match(/^border-[0-9]/)) {\n    const colorKey = cls.substring(7);\n    // Skip arbitrary values that don't look like colors (e.g., border-[3px] is width)\n    if (colorKey.startsWith(\"[\") && !colorKey.startsWith(\"[#\")) {\n      return null;\n    }\n    const color = parseColorWithOpacity(colorKey);\n    if (color) {\n      return { borderColor: color };\n    }\n  }\n\n  // Outline color: outline-blue-500, outline-blue-500/50, outline-[#ff0000]/80\n  if (cls.startsWith(\"outline-\") && !cls.match(/^outline-[0-9]/) && !cls.startsWith(\"outline-offset-\")) {\n    const colorKey = cls.substring(8); // \"outline-\".length = 8\n\n    // Skip outline-style values\n    if ([\"solid\", \"dashed\", \"dotted\", \"none\"].includes(colorKey)) {\n      return null;\n    }\n\n    // Skip arbitrary values that don't look like colors (e.g., outline-[3px] is width)\n    if (colorKey.startsWith(\"[\") && !colorKey.startsWith(\"[#\")) {\n      return null;\n    }\n    const color = parseColorWithOpacity(colorKey);\n    if (color) {\n      return { outlineColor: color };\n    }\n  }\n\n  // Directional border colors: border-t-red-500, border-l-blue-500/50, border-r-[#ff0000]\n  const dirBorderMatch = cls.match(/^border-([trblxy])-(.+)$/);\n  if (dirBorderMatch) {\n    const dir = dirBorderMatch[1];\n    const colorKey = dirBorderMatch[2];\n\n    // Skip arbitrary values that don't look like colors (e.g., border-t-[3px] is width)\n    if (colorKey.startsWith(\"[\") && !colorKey.startsWith(\"[#\")) {\n      return null;\n    }\n\n    const color = parseColorWithOpacity(colorKey);\n    if (color) {\n      // Map direction to React Native property/properties\n      // x and y apply to multiple sides (RN doesn't have borderHorizontalColor/borderVerticalColor)\n      if (dir === \"x\") {\n        return {\n          borderLeftColor: color,\n          borderRightColor: color,\n        };\n      }\n      if (dir === \"y\") {\n        return {\n          borderTopColor: color,\n          borderBottomColor: color,\n        };\n      }\n\n      const propMap: Record<string, string> = {\n        t: \"borderTopColor\",\n        r: \"borderRightColor\",\n        b: \"borderBottomColor\",\n        l: \"borderLeftColor\",\n      };\n      return { [propMap[dir]]: color };\n    }\n  }\n\n  return null;\n}\n", "/**\n * Border utilities (border width, radius, style)\n */\n\nimport type { StyleObject } from \"../types\";\nimport { parseColor } from \"./colors\";\n\n// Border width scale\nexport const BORDER_WIDTH_SCALE: Record<string, number> = {\n  \"\": 1,\n  \"0\": 0,\n  \"2\": 2,\n  \"4\": 4,\n  \"8\": 8,\n};\n\n// Border radius scale\nexport const BORDER_RADIUS_SCALE: Record<string, number> = {\n  none: 0,\n  sm: 2,\n  \"\": 4,\n  md: 6,\n  lg: 8,\n  xl: 12,\n  \"2xl\": 16,\n  \"3xl\": 24,\n  full: 9999,\n};\n\n/**\n * Property mapping for border width directions\n */\nconst BORDER_WIDTH_PROP_MAP: Record<string, string> = {\n  t: \"borderTopWidth\",\n  r: \"borderRightWidth\",\n  b: \"borderBottomWidth\",\n  l: \"borderLeftWidth\",\n  s: \"borderStartWidth\",\n  e: \"borderEndWidth\",\n};\n\n/**\n * Property mapping for border radius corners (physical)\n */\nconst BORDER_RADIUS_CORNER_MAP: Record<string, string> = {\n  tl: \"borderTopLeftRadius\",\n  tr: \"borderTopRightRadius\",\n  bl: \"borderBottomLeftRadius\",\n  br: \"borderBottomRightRadius\",\n};\n\n/**\n * Property mapping for border radius corners (logical/RTL-aware)\n * ss = start-start (top-start), se = start-end (top-end)\n * es = end-start (bottom-start), ee = end-end (bottom-end)\n */\nconst BORDER_RADIUS_LOGICAL_CORNER_MAP: Record<string, string> = {\n  ss: \"borderTopStartRadius\",\n  se: \"borderTopEndRadius\",\n  es: \"borderBottomStartRadius\",\n  ee: \"borderBottomEndRadius\",\n};\n\n/**\n * Property mapping for border radius sides (returns array of properties)\n */\nconst BORDER_RADIUS_SIDE_MAP: Record<string, string[]> = {\n  t: [\"borderTopLeftRadius\", \"borderTopRightRadius\"],\n  r: [\"borderTopRightRadius\", \"borderBottomRightRadius\"],\n  b: [\"borderBottomLeftRadius\", \"borderBottomRightRadius\"],\n  l: [\"borderTopLeftRadius\", \"borderBottomLeftRadius\"],\n  s: [\"borderTopStartRadius\", \"borderBottomStartRadius\"],\n  e: [\"borderTopEndRadius\", \"borderBottomEndRadius\"],\n};\n\n/**\n * Parse arbitrary border width value: [8px], [4]\n * Returns number for px values, null for unsupported formats\n */\nfunction parseArbitraryBorderWidth(value: string): number | null {\n  // Match: [8px] or [8] (pixels only)\n  const pxMatch = value.match(/^\\[(\\d+)(?:px)?\\]$/);\n  if (pxMatch) {\n    return parseInt(pxMatch[1], 10);\n  }\n\n  // Warn about unsupported formats\n  if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n    /* v8 ignore next 5 */\n    if (process.env.NODE_ENV !== \"production\") {\n      console.warn(\n        `[react-native-tailwind] Unsupported arbitrary border width value: ${value}. Only px values are supported (e.g., [8px] or [8]).`,\n      );\n    }\n    return null;\n  }\n\n  return null;\n}\n\n/**\n * Parse arbitrary border radius value: [12px], [8]\n * Returns number for px values, null for unsupported formats\n */\nfunction parseArbitraryBorderRadius(value: string): number | null {\n  // Match: [12px] or [12] (pixels only)\n  const pxMatch = value.match(/^\\[(\\d+)(?:px)?\\]$/);\n  if (pxMatch) {\n    return parseInt(pxMatch[1], 10);\n  }\n\n  // Warn about unsupported formats\n  if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n    /* v8 ignore next 5 */\n    if (process.env.NODE_ENV !== \"production\") {\n      console.warn(\n        `[react-native-tailwind] Unsupported arbitrary border radius value: ${value}. Only px values are supported (e.g., [12px] or [12]).`,\n      );\n    }\n    return null;\n  }\n\n  return null;\n}\n\n/**\n * Parse border classes\n * @param cls - The class name to parse\n * @param customColors - Optional custom colors from tailwind.config (used to detect color patterns)\n */\nexport function parseBorder(cls: string, customColors?: Record<string, string>): StyleObject | null {\n  // Border style (must come before parseBorderWidth)\n  if (cls === \"border-solid\") return { borderStyle: \"solid\" };\n  if (cls === \"border-dotted\") return { borderStyle: \"dotted\" };\n  if (cls === \"border-dashed\") return { borderStyle: \"dashed\" };\n\n  // Border width (border-0, border-t, border-[8px], etc.)\n  if (cls.startsWith(\"border-\")) {\n    return parseBorderWidth(cls, customColors);\n  }\n\n  if (cls === \"border\") {\n    return { borderWidth: 1 };\n  }\n\n  // Border radius (rounded, rounded-t, rounded-[12px], etc.)\n  if (cls.startsWith(\"rounded\")) {\n    return parseBorderRadius(cls);\n  }\n\n  return null;\n}\n\n/**\n * Parse border width classes\n * @param cls - The class name to parse\n * @param customColors - Optional custom colors (passed to parseColor for pattern detection)\n */\nfunction parseBorderWidth(cls: string, customColors?: Record<string, string>): StyleObject | null {\n  // Directional borders: border-t, border-t-2, border-t-[8px], border-s, border-e (RTL-aware)\n  // Note: border-x and border-y are handled by parseColor for colors only\n  const dirMatch = cls.match(/^border-([trblse])(?:-(.+))?$/);\n  if (dirMatch) {\n    const dir = dirMatch[1];\n    const valueStr = dirMatch[2] || \"\"; // empty string for border-t\n\n    // If it's a color pattern, let parseColor handle it\n    // Try to parse as color - if it succeeds, return null (let parseColor handle it)\n    // Note: We skip color check for s/e since React Native doesn't support borderStartColor/borderEndColor\n    if (valueStr && dir !== \"s\" && dir !== \"e\") {\n      const colorResult = parseColor(cls, customColors);\n      if (colorResult !== null) {\n        return null; // It's a color, let parseColor handle it\n      }\n    }\n\n    // Try arbitrary value first (if it starts with [)\n    if (valueStr.startsWith(\"[\")) {\n      const arbitraryValue = parseArbitraryBorderWidth(valueStr);\n      if (arbitraryValue !== null) {\n        return { [BORDER_WIDTH_PROP_MAP[dir]]: arbitraryValue };\n      }\n      return null;\n    }\n\n    // Try preset scale\n    const scaleValue = BORDER_WIDTH_SCALE[valueStr];\n    if (scaleValue !== undefined) {\n      return { [BORDER_WIDTH_PROP_MAP[dir]]: scaleValue };\n    }\n\n    return null;\n  }\n\n  // All borders with preset values: border-0, border-2, border-4, border-8\n  const allMatch = cls.match(/^border-(\\d+)$/);\n  if (allMatch) {\n    const value = BORDER_WIDTH_SCALE[allMatch[1]];\n    if (value !== undefined) {\n      return { borderWidth: value };\n    }\n  }\n\n  // All borders with arbitrary values: border-[8px]\n  const allArbMatch = cls.match(/^border-(\\[.+\\])$/);\n  if (allArbMatch) {\n    const arbitraryValue = parseArbitraryBorderWidth(allArbMatch[1]);\n    if (arbitraryValue !== null) {\n      return { borderWidth: arbitraryValue };\n    }\n  }\n\n  return null;\n}\n\n/**\n * Parse border radius classes\n */\nfunction parseBorderRadius(cls: string): StyleObject | null {\n  // Remove \"rounded\" prefix for easier parsing\n  const withoutPrefix = cls.substring(7); // \"rounded\".length = 7\n\n  // Handle \"rounded\" by itself\n  if (withoutPrefix === \"\") {\n    return { borderRadius: BORDER_RADIUS_SCALE[\"\"] };\n  }\n\n  // Must start with \"-\" after \"rounded\"\n  if (!withoutPrefix.startsWith(\"-\")) {\n    return null;\n  }\n\n  const rest = withoutPrefix.substring(1); // Remove leading \"-\"\n\n  // Handle \"rounded-\" (just dash, no content)\n  if (rest === \"\") {\n    return null;\n  }\n\n  // Specific physical corners: rounded-tl, rounded-tl-lg, rounded-tl-[8px]\n  const cornerMatch = rest.match(/^(tl|tr|bl|br)(?:-(.+))?$/);\n  if (cornerMatch) {\n    const corner = cornerMatch[1];\n    const valueStr = cornerMatch[2] || \"\"; // empty string for rounded-tl\n\n    // Try arbitrary value first\n    if (valueStr.startsWith(\"[\")) {\n      const arbitraryValue = parseArbitraryBorderRadius(valueStr);\n      if (arbitraryValue !== null) {\n        return { [BORDER_RADIUS_CORNER_MAP[corner]]: arbitraryValue };\n      }\n      return null;\n    }\n\n    // Try preset scale\n    const scaleValue = BORDER_RADIUS_SCALE[valueStr];\n    if (scaleValue !== undefined) {\n      return { [BORDER_RADIUS_CORNER_MAP[corner]]: scaleValue };\n    }\n\n    return null;\n  }\n\n  // Logical corners (RTL-aware): rounded-ss, rounded-se, rounded-es, rounded-ee\n  // ss = start-start (top-start), se = start-end (top-end)\n  // es = end-start (bottom-start), ee = end-end (bottom-end)\n  const logicalCornerMatch = rest.match(/^(ss|se|es|ee)(?:-(.+))?$/);\n  if (logicalCornerMatch) {\n    const corner = logicalCornerMatch[1];\n    const valueStr = logicalCornerMatch[2] || \"\"; // empty string for rounded-ss\n\n    // Try arbitrary value first\n    if (valueStr.startsWith(\"[\")) {\n      const arbitraryValue = parseArbitraryBorderRadius(valueStr);\n      if (arbitraryValue !== null) {\n        return { [BORDER_RADIUS_LOGICAL_CORNER_MAP[corner]]: arbitraryValue };\n      }\n      return null;\n    }\n\n    // Try preset scale\n    const scaleValue = BORDER_RADIUS_SCALE[valueStr];\n    if (scaleValue !== undefined) {\n      return { [BORDER_RADIUS_LOGICAL_CORNER_MAP[corner]]: scaleValue };\n    }\n\n    return null;\n  }\n\n  // Sides: rounded-t, rounded-t-lg, rounded-t-[8px], rounded-s, rounded-e (RTL-aware)\n  const sideMatch = rest.match(/^([trblse])(?:-(.+))?$/);\n  if (sideMatch) {\n    const side = sideMatch[1];\n    const valueStr = sideMatch[2] || \"\"; // empty string for rounded-t\n\n    let value: number | undefined;\n\n    // Try arbitrary value first\n    if (valueStr.startsWith(\"[\")) {\n      const arbitraryValue = parseArbitraryBorderRadius(valueStr);\n      if (arbitraryValue !== null) {\n        value = arbitraryValue;\n      } else {\n        return null;\n      }\n    } else {\n      // Try preset scale\n      value = BORDER_RADIUS_SCALE[valueStr];\n    }\n\n    if (value !== undefined) {\n      const result: StyleObject = {};\n      BORDER_RADIUS_SIDE_MAP[side].forEach((prop) => (result[prop] = value));\n      return result;\n    }\n\n    return null;\n  }\n\n  // All corners with preset values: rounded-lg, rounded-xl, etc.\n  // Or arbitrary values: rounded-[12px]\n  if (rest.startsWith(\"[\")) {\n    const arbitraryValue = parseArbitraryBorderRadius(rest);\n    if (arbitraryValue !== null) {\n      return { borderRadius: arbitraryValue };\n    }\n    return null;\n  }\n\n  // Preset scale\n  const scaleValue = BORDER_RADIUS_SCALE[rest];\n  if (scaleValue !== undefined) {\n    return { borderRadius: scaleValue };\n  }\n\n  return null;\n}\n", "/**\n * Layout utilities (flexbox, positioning, display)\n */\n\nimport type { StyleObject } from \"../types\";\n\n/**\n * Parse arbitrary inset value: [123px], [123], [50%], [-10px]\n * Returns number for px values, string for % values, null for unsupported units\n */\nfunction parseArbitraryInset(value: string): number | string | null {\n  // Match: [123px], [123], [-123px], [-123] (pixels)\n  const pxMatch = value.match(/^\\[(-?\\d+)(?:px)?\\]$/);\n  if (pxMatch) {\n    return parseInt(pxMatch[1], 10);\n  }\n\n  // Match: [50%], [-50%] (percentage)\n  const percentMatch = value.match(/^\\[(-?\\d+(?:\\.\\d+)?)%\\]$/);\n  if (percentMatch) {\n    return `${percentMatch[1]}%`;\n  }\n\n  // Unsupported units (rem, em, vh, vw, etc.) - warn and reject\n  if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n    /* v8 ignore next 5 */\n    if (process.env.NODE_ENV !== \"production\") {\n      console.warn(\n        `[react-native-tailwind] Unsupported arbitrary inset unit: ${value}. Only px and % are supported.`,\n      );\n    }\n    return null;\n  }\n\n  return null;\n}\n\n/**\n * Parse arbitrary z-index value: [123], [-10]\n * Returns number for valid z-index, null otherwise\n */\nfunction parseArbitraryZIndex(value: string): number | null {\n  // Match: [123], [-123] (integers only)\n  const zMatch = value.match(/^\\[(-?\\d+)\\]$/);\n  if (zMatch) {\n    return parseInt(zMatch[1], 10);\n  }\n\n  // Unsupported format - warn and reject\n  if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n    /* v8 ignore next 5 */\n    if (process.env.NODE_ENV !== \"production\") {\n      console.warn(\n        `[react-native-tailwind] Invalid arbitrary z-index: ${value}. Only integers are supported.`,\n      );\n    }\n    return null;\n  }\n\n  return null;\n}\n\n/**\n * Parse arbitrary grow/shrink value: [1.5], [2], [0.5], [.5]\n * Returns number for valid non-negative values, null otherwise\n */\nfunction parseArbitraryGrowShrink(value: string): number | null {\n  // Match: [1.5], [2], [0], [0.5], [.5] (non-negative decimals, optional leading digit)\n  const match = value.match(/^\\[(\\d+(?:\\.\\d+)?|\\.\\d+)\\]$/);\n  if (match) {\n    return parseFloat(match[1]);\n  }\n\n  // Warn about invalid formats (negative values, unsupported formats)\n  if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n    /* v8 ignore next 5 */\n    if (process.env.NODE_ENV !== \"production\") {\n      console.warn(\n        `[react-native-tailwind] Invalid arbitrary grow/shrink value: ${value}. Only non-negative numbers are supported (e.g., [1.5], [2], [0.5], [.5]).`,\n      );\n    }\n    return null;\n  }\n\n  return null;\n}\n\n// Display utilities\nconst DISPLAY_MAP: Record<string, StyleObject> = {\n  flex: { display: \"flex\" },\n  hidden: { display: \"none\" },\n};\n\n// Flex direction utilities\nconst FLEX_DIRECTION_MAP: Record<string, StyleObject> = {\n  \"flex-row\": { flexDirection: \"row\" },\n  \"flex-row-reverse\": { flexDirection: \"row-reverse\" },\n  \"flex-col\": { flexDirection: \"column\" },\n  \"flex-col-reverse\": { flexDirection: \"column-reverse\" },\n};\n\n// Flex wrap utilities\nconst FLEX_WRAP_MAP: Record<string, StyleObject> = {\n  \"flex-wrap\": { flexWrap: \"wrap\" },\n  \"flex-wrap-reverse\": { flexWrap: \"wrap-reverse\" },\n  \"flex-nowrap\": { flexWrap: \"nowrap\" },\n};\n\n// Flex utilities\nconst FLEX_MAP: Record<string, StyleObject> = {\n  \"flex-1\": { flex: 1 },\n  \"flex-auto\": { flex: 1 },\n  \"flex-none\": { flex: 0 },\n};\n\n// Flex grow/shrink utilities (includes CSS-style aliases)\nconst GROW_SHRINK_MAP: Record<string, StyleObject> = {\n  grow: { flexGrow: 1 },\n  \"grow-0\": { flexGrow: 0 },\n  shrink: { flexShrink: 1 },\n  \"shrink-0\": { flexShrink: 0 },\n  // CSS-style aliases\n  \"flex-grow\": { flexGrow: 1 },\n  \"flex-grow-0\": { flexGrow: 0 },\n  \"flex-shrink\": { flexShrink: 1 },\n  \"flex-shrink-0\": { flexShrink: 0 },\n};\n\n// Justify content utilities\nconst JUSTIFY_CONTENT_MAP: Record<string, StyleObject> = {\n  \"justify-start\": { justifyContent: \"flex-start\" },\n  \"justify-end\": { justifyContent: \"flex-end\" },\n  \"justify-center\": { justifyContent: \"center\" },\n  \"justify-between\": { justifyContent: \"space-between\" },\n  \"justify-around\": { justifyContent: \"space-around\" },\n  \"justify-evenly\": { justifyContent: \"space-evenly\" },\n};\n\n// Align items utilities\nconst ALIGN_ITEMS_MAP: Record<string, StyleObject> = {\n  \"items-start\": { alignItems: \"flex-start\" },\n  \"items-end\": { alignItems: \"flex-end\" },\n  \"items-center\": { alignItems: \"center\" },\n  \"items-baseline\": { alignItems: \"baseline\" },\n  \"items-stretch\": { alignItems: \"stretch\" },\n};\n\n// Align self utilities\nconst ALIGN_SELF_MAP: Record<string, StyleObject> = {\n  \"self-auto\": { alignSelf: \"auto\" },\n  \"self-start\": { alignSelf: \"flex-start\" },\n  \"self-end\": { alignSelf: \"flex-end\" },\n  \"self-center\": { alignSelf: \"center\" },\n  \"self-stretch\": { alignSelf: \"stretch\" },\n  \"self-baseline\": { alignSelf: \"baseline\" },\n};\n\n// Align content utilities\nconst ALIGN_CONTENT_MAP: Record<string, StyleObject> = {\n  \"content-start\": { alignContent: \"flex-start\" },\n  \"content-end\": { alignContent: \"flex-end\" },\n  \"content-center\": { alignContent: \"center\" },\n  \"content-between\": { alignContent: \"space-between\" },\n  \"content-around\": { alignContent: \"space-around\" },\n  \"content-stretch\": { alignContent: \"stretch\" },\n};\n\n// Position utilities\nconst POSITION_MAP: Record<string, StyleObject> = {\n  absolute: { position: \"absolute\" },\n  relative: { position: \"relative\" },\n};\n\n// Overflow utilities\nconst OVERFLOW_MAP: Record<string, StyleObject> = {\n  \"overflow-hidden\": { overflow: \"hidden\" },\n  \"overflow-visible\": { overflow: \"visible\" },\n  \"overflow-scroll\": { overflow: \"scroll\" },\n};\n\n// Opacity utilities\nconst OPACITY_MAP: Record<string, StyleObject> = {\n  \"opacity-0\": { opacity: 0 },\n  \"opacity-5\": { opacity: 0.05 },\n  \"opacity-10\": { opacity: 0.1 },\n  \"opacity-15\": { opacity: 0.15 },\n  \"opacity-20\": { opacity: 0.2 },\n  \"opacity-25\": { opacity: 0.25 },\n  \"opacity-30\": { opacity: 0.3 },\n  \"opacity-35\": { opacity: 0.35 },\n  \"opacity-40\": { opacity: 0.4 },\n  \"opacity-45\": { opacity: 0.45 },\n  \"opacity-50\": { opacity: 0.5 },\n  \"opacity-55\": { opacity: 0.55 },\n  \"opacity-60\": { opacity: 0.6 },\n  \"opacity-65\": { opacity: 0.65 },\n  \"opacity-70\": { opacity: 0.7 },\n  \"opacity-75\": { opacity: 0.75 },\n  \"opacity-80\": { opacity: 0.8 },\n  \"opacity-85\": { opacity: 0.85 },\n  \"opacity-90\": { opacity: 0.9 },\n  \"opacity-95\": { opacity: 0.95 },\n  \"opacity-100\": { opacity: 1 },\n};\n\n// Z-index scale\nexport const Z_INDEX_SCALE: Record<string, number> = {\n  0: 0,\n  10: 10,\n  20: 20,\n  30: 30,\n  40: 40,\n  50: 50,\n  auto: 0, // React Native doesn't have 'auto', default to 0\n};\n\n// Inset scale (for top/right/bottom/left positioning in pixels)\nexport const INSET_SCALE: Record<string, number> = {\n  0: 0,\n  0.5: 2,\n  1: 4,\n  1.5: 6,\n  2: 8,\n  2.5: 10,\n  3: 12,\n  3.5: 14,\n  4: 16,\n  5: 20,\n  6: 24,\n  8: 32,\n  10: 40,\n  12: 48,\n  16: 64,\n  20: 80,\n  24: 96,\n};\n\n/**\n * Parse layout classes\n * @param cls - The class name to parse\n * @param customSpacing - Optional custom spacing values from tailwind.config (for inset utilities)\n */\nexport function parseLayout(cls: string, customSpacing?: Record<string, number>): StyleObject | null {\n  // Merge custom spacing with defaults for inset utilities\n  const insetMap = customSpacing ? { ...INSET_SCALE, ...customSpacing } : INSET_SCALE;\n\n  // Z-index: z-0, z-10, z-20, z-[999], etc.\n  if (cls.startsWith(\"z-\")) {\n    const zKey = cls.substring(2);\n\n    // Arbitrary values: z-[123], z-[-10]\n    const arbitraryZ = parseArbitraryZIndex(zKey);\n    if (arbitraryZ !== null) {\n      return { zIndex: arbitraryZ };\n    }\n\n    const zValue = Z_INDEX_SCALE[zKey];\n    if (zValue !== undefined) {\n      return { zIndex: zValue };\n    }\n  }\n\n  // Top positioning: top-0, top-4, top-[10px], top-[50%], -top-4, etc.\n  const topMatch = cls.match(/^(-?)top-(.+)$/);\n  if (topMatch) {\n    const [, negPrefix, topKey] = topMatch;\n    const isNegative = negPrefix === \"-\";\n\n    // Auto value - return empty object (no-op, removes the property)\n    if (topKey === \"auto\") {\n      return {};\n    }\n\n    // Arbitrary values: top-[123px], top-[50%], -top-[10px]\n    const arbitraryTop = parseArbitraryInset(topKey);\n    if (arbitraryTop !== null) {\n      if (typeof arbitraryTop === \"number\") {\n        return { top: isNegative ? -arbitraryTop : arbitraryTop };\n      }\n      // Percentage values with negative prefix\n      if (isNegative && arbitraryTop.endsWith(\"%\")) {\n        const numValue = parseFloat(arbitraryTop);\n        return { top: `${-numValue}%` };\n      }\n      return { top: arbitraryTop };\n    }\n\n    const topValue = insetMap[topKey];\n    if (topValue !== undefined) {\n      return { top: isNegative ? -topValue : topValue };\n    }\n  }\n\n  // Right positioning: right-0, right-4, right-[10px], right-[50%], -right-4, etc.\n  const rightMatch = cls.match(/^(-?)right-(.+)$/);\n  if (rightMatch) {\n    const [, negPrefix, rightKey] = rightMatch;\n    const isNegative = negPrefix === \"-\";\n\n    // Auto value - return empty object (no-op, removes the property)\n    if (rightKey === \"auto\") {\n      return {};\n    }\n\n    // Arbitrary values: right-[123px], right-[50%], -right-[10px]\n    const arbitraryRight = parseArbitraryInset(rightKey);\n    if (arbitraryRight !== null) {\n      if (typeof arbitraryRight === \"number\") {\n        return { right: isNegative ? -arbitraryRight : arbitraryRight };\n      }\n      // Percentage values with negative prefix\n      if (isNegative && arbitraryRight.endsWith(\"%\")) {\n        const numValue = parseFloat(arbitraryRight);\n        return { right: `${-numValue}%` };\n      }\n      return { right: arbitraryRight };\n    }\n\n    const rightValue = insetMap[rightKey];\n    if (rightValue !== undefined) {\n      return { right: isNegative ? -rightValue : rightValue };\n    }\n  }\n\n  // Bottom positioning: bottom-0, bottom-4, bottom-[10px], bottom-[50%], -bottom-4, etc.\n  const bottomMatch = cls.match(/^(-?)bottom-(.+)$/);\n  if (bottomMatch) {\n    const [, negPrefix, bottomKey] = bottomMatch;\n    const isNegative = negPrefix === \"-\";\n\n    // Auto value - return empty object (no-op, removes the property)\n    if (bottomKey === \"auto\") {\n      return {};\n    }\n\n    // Arbitrary values: bottom-[123px], bottom-[50%], -bottom-[10px]\n    const arbitraryBottom = parseArbitraryInset(bottomKey);\n    if (arbitraryBottom !== null) {\n      if (typeof arbitraryBottom === \"number\") {\n        return { bottom: isNegative ? -arbitraryBottom : arbitraryBottom };\n      }\n      // Percentage values with negative prefix\n      if (isNegative && arbitraryBottom.endsWith(\"%\")) {\n        const numValue = parseFloat(arbitraryBottom);\n        return { bottom: `${-numValue}%` };\n      }\n      return { bottom: arbitraryBottom };\n    }\n\n    const bottomValue = insetMap[bottomKey];\n    if (bottomValue !== undefined) {\n      return { bottom: isNegative ? -bottomValue : bottomValue };\n    }\n  }\n\n  // Left positioning: left-0, left-4, left-[10px], left-[50%], -left-4, etc.\n  const leftMatch = cls.match(/^(-?)left-(.+)$/);\n  if (leftMatch) {\n    const [, negPrefix, leftKey] = leftMatch;\n    const isNegative = negPrefix === \"-\";\n\n    // Auto value - return empty object (no-op, removes the property)\n    if (leftKey === \"auto\") {\n      return {};\n    }\n\n    // Arbitrary values: left-[123px], left-[50%], -left-[10px]\n    const arbitraryLeft = parseArbitraryInset(leftKey);\n    if (arbitraryLeft !== null) {\n      if (typeof arbitraryLeft === \"number\") {\n        return { left: isNegative ? -arbitraryLeft : arbitraryLeft };\n      }\n      // Percentage values with negative prefix\n      if (isNegative && arbitraryLeft.endsWith(\"%\")) {\n        const numValue = parseFloat(arbitraryLeft);\n        return { left: `${-numValue}%` };\n      }\n      return { left: arbitraryLeft };\n    }\n\n    const leftValue = insetMap[leftKey];\n    if (leftValue !== undefined) {\n      return { left: isNegative ? -leftValue : leftValue };\n    }\n  }\n\n  // Start positioning (RTL-aware): start-0, start-4, start-[10px], -start-4, etc.\n  const startMatch = cls.match(/^(-?)start-(.+)$/);\n  if (startMatch) {\n    const [, negPrefix, startKey] = startMatch;\n    const isNegative = negPrefix === \"-\";\n\n    // Auto value - return empty object (no-op, removes the property)\n    if (startKey === \"auto\") {\n      return {};\n    }\n\n    // Arbitrary values: start-[123px], start-[50%], -start-[10px]\n    const arbitraryStart = parseArbitraryInset(startKey);\n    if (arbitraryStart !== null) {\n      if (typeof arbitraryStart === \"number\") {\n        return { start: isNegative ? -arbitraryStart : arbitraryStart };\n      }\n      // Percentage values with negative prefix\n      if (isNegative && arbitraryStart.endsWith(\"%\")) {\n        const numValue = parseFloat(arbitraryStart);\n        return { start: `${-numValue}%` };\n      }\n      return { start: arbitraryStart };\n    }\n\n    const startValue = insetMap[startKey];\n    if (startValue !== undefined) {\n      return { start: isNegative ? -startValue : startValue };\n    }\n  }\n\n  // End positioning (RTL-aware): end-0, end-4, end-[10px], -end-4, etc.\n  const endMatch = cls.match(/^(-?)end-(.+)$/);\n  if (endMatch) {\n    const [, negPrefix, endKey] = endMatch;\n    const isNegative = negPrefix === \"-\";\n\n    // Auto value - return empty object (no-op, removes the property)\n    if (endKey === \"auto\") {\n      return {};\n    }\n\n    // Arbitrary values: end-[123px], end-[50%], -end-[10px]\n    const arbitraryEnd = parseArbitraryInset(endKey);\n    if (arbitraryEnd !== null) {\n      if (typeof arbitraryEnd === \"number\") {\n        return { end: isNegative ? -arbitraryEnd : arbitraryEnd };\n      }\n      // Percentage values with negative prefix\n      if (isNegative && arbitraryEnd.endsWith(\"%\")) {\n        const numValue = parseFloat(arbitraryEnd);\n        return { end: `${-numValue}%` };\n      }\n      return { end: arbitraryEnd };\n    }\n\n    const endValue = insetMap[endKey];\n    if (endValue !== undefined) {\n      return { end: isNegative ? -endValue : endValue };\n    }\n  }\n\n  // Inset X (left and right): inset-x-0, inset-x-4, inset-x-[10px], etc.\n  if (cls.startsWith(\"inset-x-\")) {\n    const insetKey = cls.substring(8);\n\n    // Arbitrary values: inset-x-[123px], inset-x-[50%]\n    const arbitraryInset = parseArbitraryInset(insetKey);\n    if (arbitraryInset !== null) {\n      return { left: arbitraryInset, right: arbitraryInset };\n    }\n\n    const insetValue = insetMap[insetKey];\n    if (insetValue !== undefined) {\n      return { left: insetValue, right: insetValue };\n    }\n  }\n\n  // Inset Y (top and bottom): inset-y-0, inset-y-4, inset-y-[10px], etc.\n  if (cls.startsWith(\"inset-y-\")) {\n    const insetKey = cls.substring(8);\n\n    // Arbitrary values: inset-y-[123px], inset-y-[50%]\n    const arbitraryInset = parseArbitraryInset(insetKey);\n    if (arbitraryInset !== null) {\n      return { top: arbitraryInset, bottom: arbitraryInset };\n    }\n\n    const insetValue = insetMap[insetKey];\n    if (insetValue !== undefined) {\n      return { top: insetValue, bottom: insetValue };\n    }\n  }\n\n  // Inset S (start, RTL-aware): inset-s-0, inset-s-4, inset-s-[10px], etc.\n  if (cls.startsWith(\"inset-s-\")) {\n    const insetKey = cls.substring(8);\n\n    // Arbitrary values: inset-s-[123px], inset-s-[50%]\n    const arbitraryInset = parseArbitraryInset(insetKey);\n    if (arbitraryInset !== null) {\n      return { start: arbitraryInset };\n    }\n\n    const insetValue = insetMap[insetKey];\n    if (insetValue !== undefined) {\n      return { start: insetValue };\n    }\n  }\n\n  // Inset E (end, RTL-aware): inset-e-0, inset-e-4, inset-e-[10px], etc.\n  if (cls.startsWith(\"inset-e-\")) {\n    const insetKey = cls.substring(8);\n\n    // Arbitrary values: inset-e-[123px], inset-e-[50%]\n    const arbitraryInset = parseArbitraryInset(insetKey);\n    if (arbitraryInset !== null) {\n      return { end: arbitraryInset };\n    }\n\n    const insetValue = insetMap[insetKey];\n    if (insetValue !== undefined) {\n      return { end: insetValue };\n    }\n  }\n\n  // Inset (all sides): inset-0, inset-4, inset-[10px], etc.\n  if (cls.startsWith(\"inset-\")) {\n    const insetKey = cls.substring(6);\n\n    // Arbitrary values: inset-[123px], inset-[50%]\n    const arbitraryInset = parseArbitraryInset(insetKey);\n    if (arbitraryInset !== null) {\n      return { top: arbitraryInset, right: arbitraryInset, bottom: arbitraryInset, left: arbitraryInset };\n    }\n\n    const insetValue = insetMap[insetKey];\n    if (insetValue !== undefined) {\n      return { top: insetValue, right: insetValue, bottom: insetValue, left: insetValue };\n    }\n  }\n\n  // Flex grow: grow-[1.5], flex-grow-[2], etc. (arbitrary values)\n  if (cls.startsWith(\"grow-\") || cls.startsWith(\"flex-grow-\")) {\n    const prefix = cls.startsWith(\"flex-grow-\") ? \"flex-grow-\" : \"grow-\";\n    const growKey = cls.substring(prefix.length);\n\n    // Arbitrary values: grow-[1.5], flex-grow-[2]\n    const arbitraryGrow = parseArbitraryGrowShrink(growKey);\n    if (arbitraryGrow !== null) {\n      return { flexGrow: arbitraryGrow };\n    }\n  }\n\n  // Flex shrink: shrink-[0.5], flex-shrink-[1], etc. (arbitrary values)\n  if (cls.startsWith(\"shrink-\") || cls.startsWith(\"flex-shrink-\")) {\n    const prefix = cls.startsWith(\"flex-shrink-\") ? \"flex-shrink-\" : \"shrink-\";\n    const shrinkKey = cls.substring(prefix.length);\n\n    // Arbitrary values: shrink-[0.5], flex-shrink-[1]\n    const arbitraryShrink = parseArbitraryGrowShrink(shrinkKey);\n    if (arbitraryShrink !== null) {\n      return { flexShrink: arbitraryShrink };\n    }\n  }\n\n  // Try each lookup table in order\n  return (\n    DISPLAY_MAP[cls] ??\n    FLEX_DIRECTION_MAP[cls] ??\n    FLEX_WRAP_MAP[cls] ??\n    FLEX_MAP[cls] ??\n    GROW_SHRINK_MAP[cls] ??\n    JUSTIFY_CONTENT_MAP[cls] ??\n    ALIGN_ITEMS_MAP[cls] ??\n    ALIGN_SELF_MAP[cls] ??\n    ALIGN_CONTENT_MAP[cls] ??\n    POSITION_MAP[cls] ??\n    OVERFLOW_MAP[cls] ??\n    OPACITY_MAP[cls] ??\n    null\n  );\n}\n", "/**\n * Outline utilities (outline width, style, offset)\n */\n\nimport type { StyleObject } from \"../types\";\nimport { BORDER_WIDTH_SCALE } from \"./borders\";\n\n/**\n * Parse arbitrary outline width/offset value: [8px], [4]\n * Returns number for px values, null for unsupported formats\n */\nfunction parseArbitraryOutlineValue(value: string): number | null {\n  // Match: [8px] or [8] (pixels only)\n  const pxMatch = value.match(/^\\[(\\d+)(?:px)?\\]$/);\n  if (pxMatch) {\n    return parseInt(pxMatch[1], 10);\n  }\n\n  // Warn about unsupported formats\n  if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n    /* v8 ignore next 5 */\n    if (process.env.NODE_ENV !== \"production\") {\n      console.warn(\n        `[react-native-tailwind] Unsupported arbitrary outline value: ${value}. Only px values are supported (e.g., [8px] or [8]).`,\n      );\n    }\n    return null;\n  }\n\n  return null;\n}\n\n/**\n * Parse outline classes\n * @param cls - The class name to parse\n */\nexport function parseOutline(cls: string): StyleObject | null {\n  // Shorthand: outline (width: 1, style: solid)\n  if (cls === \"outline\") {\n    return { outlineWidth: 1, outlineStyle: \"solid\" };\n  }\n\n  // Outline none\n  if (cls === \"outline-none\") {\n    return { outlineWidth: 0 };\n  }\n\n  // Outline style\n  if (cls === \"outline-solid\") return { outlineStyle: \"solid\" };\n  if (cls === \"outline-dotted\") return { outlineStyle: \"dotted\" };\n  if (cls === \"outline-dashed\") return { outlineStyle: \"dashed\" };\n\n  // Outline offset: outline-offset-2, outline-offset-[3px]\n  if (cls.startsWith(\"outline-offset-\")) {\n    const valueStr = cls.substring(15); // \"outline-offset-\".length = 15\n\n    // Try arbitrary value first\n    if (valueStr.startsWith(\"[\")) {\n      const arbitraryValue = parseArbitraryOutlineValue(valueStr);\n      if (arbitraryValue !== null) {\n        return { outlineOffset: arbitraryValue };\n      }\n      return null;\n    }\n\n    // Try preset scale (reuse border width scale for consistency with default Tailwind)\n    const scaleValue = BORDER_WIDTH_SCALE[valueStr];\n    if (scaleValue !== undefined) {\n      return { outlineOffset: scaleValue };\n    }\n\n    return null;\n  }\n\n  // Outline width: outline-0, outline-2, outline-[5px]\n  // Must handle potential collision with outline-red-500 (colors)\n  // Logic: if it matches width pattern, return width. If it looks like color, return null (let parseColor handle it)\n\n  const widthMatch = cls.match(/^outline-(\\d+)$/);\n  if (widthMatch) {\n    const value = BORDER_WIDTH_SCALE[widthMatch[1]];\n    if (value !== undefined) {\n      return { outlineWidth: value };\n    }\n  }\n\n  const arbMatch = cls.match(/^outline-(\\[.+\\])$/);\n  if (arbMatch) {\n    // Check if it's a color first? No, colors usually look like [#...] or [rgb(...)]\n    // parseArbitraryOutlineValue only accepts [123] or [123px]\n    // If it fails, it might be a color, so we return null\n    const arbitraryValue = parseArbitraryOutlineValue(arbMatch[1]);\n    if (arbitraryValue !== null) {\n      return { outlineWidth: arbitraryValue };\n    }\n    return null;\n  }\n\n  // If it's outline-{color}, return null so parseColor (called later in index.ts) handles it\n  return null;\n}\n", "/**\n * Shadow and elevation utilities for React Native\n * iOS uses shadow* properties, Android uses elevation\n */\n\nimport type { StyleObject } from \"../types\";\nimport { COLORS, parseColorValue } from \"../utils/colorUtils\";\n\n/**\n * Shadow scale definitions combining iOS and Android properties\n * Based on Tailwind CSS shadow scale, adapted for React Native\n *\n * Note: We include BOTH iOS shadow properties AND Android elevation in each style.\n * React Native will automatically use the appropriate properties for each platform:\n * - iOS uses shadowColor, shadowOffset, shadowOpacity, shadowRadius\n * - Android uses elevation\n */\nconst SHADOW_SCALE: Record<string, StyleObject> = {\n  \"shadow-sm\": {\n    shadowColor: \"#000000\",\n    shadowOffset: { width: 0, height: 1 },\n    shadowOpacity: 0.05,\n    shadowRadius: 1,\n    elevation: 1,\n  },\n  shadow: {\n    shadowColor: \"#000000\",\n    shadowOffset: { width: 0, height: 1 },\n    shadowOpacity: 0.1,\n    shadowRadius: 2,\n    elevation: 2,\n  },\n  \"shadow-md\": {\n    shadowColor: \"#000000\",\n    shadowOffset: { width: 0, height: 3 },\n    shadowOpacity: 0.15,\n    shadowRadius: 4,\n    elevation: 4,\n  },\n  \"shadow-lg\": {\n    shadowColor: \"#000000\",\n    shadowOffset: { width: 0, height: 6 },\n    shadowOpacity: 0.2,\n    shadowRadius: 8,\n    elevation: 8,\n  },\n  \"shadow-xl\": {\n    shadowColor: \"#000000\",\n    shadowOffset: { width: 0, height: 10 },\n    shadowOpacity: 0.25,\n    shadowRadius: 12,\n    elevation: 12,\n  },\n  \"shadow-2xl\": {\n    shadowColor: \"#000000\",\n    shadowOffset: { width: 0, height: 20 },\n    shadowOpacity: 0.3,\n    shadowRadius: 24,\n    elevation: 16,\n  },\n  \"shadow-none\": {\n    shadowColor: \"transparent\",\n    shadowOffset: { width: 0, height: 0 },\n    shadowOpacity: 0,\n    shadowRadius: 0,\n    elevation: 0,\n  },\n};\n\n/**\n * Parse shadow classes\n * Supports shadow size presets (shadow-sm, shadow-md, etc.) and\n * shadow colors (shadow-red-500, shadow-blue-800/50, shadow-[#ff0000]/80)\n *\n * @param cls - Class name to parse\n * @param customColors - Optional custom colors from tailwind.config\n * @returns Style object or null if not a shadow class\n */\nexport function parseShadow(cls: string, customColors?: Record<string, string>): StyleObject | null {\n  // Check if it's a shadow size preset\n  if (cls in SHADOW_SCALE) {\n    return SHADOW_SCALE[cls];\n  }\n\n  // Check for shadow color: shadow-red-500, shadow-red-500/50, shadow-[#ff0000]/80\n  if (cls.startsWith(\"shadow-\")) {\n    const colorPart = cls.substring(7); // Remove \"shadow-\"\n\n    // Parse the color value using shared utility\n    const shadowColor = parseColorValue(colorPart, customColors);\n    if (shadowColor) {\n      return { shadowColor };\n    }\n  }\n\n  return null;\n}\n\n// Export shadow scale and colors for testing/advanced usage\nexport { COLORS as SHADOW_COLORS, SHADOW_SCALE };\n", "/**\n * Runtime marker prefix for window dimension values\n * Used to mark style values that need runtime evaluation via useWindowDimensions()\n */\nexport const RUNTIME_DIMENSIONS_MARKER = \"{{RUNTIME:dimensions.\";\n", "/**\n * Sizing utilities (width, height, min/max)\n */\n\nimport { RUNTIME_DIMENSIONS_MARKER } from \"../config/markers\";\nimport type { StyleObject } from \"../types\";\n\n// Size scale (in pixels/percentages)\nexport const SIZE_SCALE: Record<string, number> = {\n  px: 1,\n  0: 0,\n  0.5: 2,\n  1: 4,\n  1.5: 6,\n  2: 8,\n  2.5: 10,\n  3: 12,\n  3.5: 14,\n  4: 16,\n  5: 20,\n  6: 24,\n  7: 28,\n  8: 32,\n  9: 36,\n  10: 40,\n  11: 44,\n  12: 48,\n  14: 56,\n  16: 64,\n  20: 80,\n  24: 96,\n  28: 112,\n  32: 128,\n  36: 144,\n  40: 160,\n  44: 176,\n  48: 192,\n  52: 208,\n  56: 224,\n  60: 240,\n  64: 256,\n  72: 288,\n  80: 320,\n  96: 384,\n};\n\nexport const SIZE_PERCENTAGES: Record<string, string> = {\n  full: \"100%\",\n  \"1/2\": \"50%\",\n  \"1/3\": \"33.333333%\",\n  \"2/3\": \"66.666667%\",\n  \"1/4\": \"25%\",\n  \"2/4\": \"50%\",\n  \"3/4\": \"75%\",\n  \"1/5\": \"20%\",\n  \"2/5\": \"40%\",\n  \"3/5\": \"60%\",\n  \"4/5\": \"80%\",\n  \"1/6\": \"16.666667%\",\n  \"2/6\": \"33.333333%\",\n  \"3/6\": \"50%\",\n  \"4/6\": \"66.666667%\",\n  \"5/6\": \"83.333333%\",\n};\n\n/**\n * Parse arbitrary size value: [123px], [50%], [10rem]\n * Returns number for px values, string for % values, null for unsupported units\n */\nfunction parseArbitrarySize(value: string): number | string | null {\n  // Match: [123px] or [123] (pixels)\n  const pxMatch = value.match(/^\\[(\\d+)(?:px)?\\]$/);\n  if (pxMatch) {\n    return parseInt(pxMatch[1], 10);\n  }\n\n  // Match: [50%] (percentage)\n  const percentMatch = value.match(/^\\[(\\d+(?:\\.\\d+)?)%\\]$/);\n  if (percentMatch) {\n    return `${percentMatch[1]}%`;\n  }\n\n  // Unsupported units (rem, em, vh, vw, etc.) - warn and reject\n  if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n    /* v8 ignore next 5 */\n    if (process.env.NODE_ENV !== \"production\") {\n      console.warn(\n        `[react-native-tailwind] Unsupported arbitrary size unit: ${value}. Only px and % are supported.`,\n      );\n    }\n    return null;\n  }\n\n  return null;\n}\n\n/**\n * Parse sizing classes\n * @param cls - The class name to parse\n * @param customSpacing - Optional custom spacing values from tailwind.config (shared with spacing utilities)\n */\nexport function parseSizing(cls: string, customSpacing?: Record<string, number>): StyleObject | null {\n  // Merge custom spacing with defaults (custom takes precedence)\n  const sizeMap = customSpacing ? { ...SIZE_SCALE, ...customSpacing } : SIZE_SCALE;\n\n  // Size (both width AND height)\n  if (cls.startsWith(\"size-\")) {\n    const sizeKey = cls.substring(5); // \"size-\".length = 5\n\n    // Arbitrary values: size-[123px], size-[50%] (highest priority)\n    const arbitrarySize = parseArbitrarySize(sizeKey);\n    if (arbitrarySize !== null) {\n      return { width: arbitrarySize, height: arbitrarySize };\n    }\n\n    // Percentage sizes: size-full, size-1/2, etc.\n    const percentage = SIZE_PERCENTAGES[sizeKey];\n    if (percentage) {\n      return { width: percentage, height: percentage };\n    }\n\n    // Numeric sizes: size-4, size-8, etc. (includes custom spacing)\n    const numericSize = sizeMap[sizeKey];\n    if (numericSize !== undefined) {\n      return { width: numericSize, height: numericSize };\n    }\n\n    // Special values\n    if (sizeKey === \"auto\") {\n      return { width: \"auto\", height: \"auto\" };\n    }\n  }\n\n  // Width\n  if (cls.startsWith(\"w-\")) {\n    const sizeKey = cls.substring(2);\n\n    // Screen width (requires runtime hook)\n    if (sizeKey === \"screen\") {\n      return { width: `${RUNTIME_DIMENSIONS_MARKER}width}}` } as StyleObject;\n    }\n\n    // Arbitrary values: w-[123px], w-[50%] (highest priority)\n    const arbitrarySize = parseArbitrarySize(sizeKey);\n    if (arbitrarySize !== null) {\n      return { width: arbitrarySize };\n    }\n\n    // Percentage widths: w-full, w-1/2, etc.\n    const percentage = SIZE_PERCENTAGES[sizeKey];\n    if (percentage) {\n      return { width: percentage };\n    }\n\n    // Numeric widths: w-4, w-8, etc. (includes custom spacing)\n    const numericSize = sizeMap[sizeKey];\n    if (numericSize !== undefined) {\n      return { width: numericSize };\n    }\n\n    // Special values\n    if (sizeKey === \"auto\") {\n      return { width: \"auto\" };\n    }\n  }\n\n  // Height\n  if (cls.startsWith(\"h-\")) {\n    const sizeKey = cls.substring(2);\n\n    // Screen height (requires runtime hook)\n    if (sizeKey === \"screen\") {\n      return { height: `${RUNTIME_DIMENSIONS_MARKER}height}}` } as StyleObject;\n    }\n\n    // Arbitrary values: h-[123px], h-[50%] (highest priority)\n    const arbitrarySize = parseArbitrarySize(sizeKey);\n    if (arbitrarySize !== null) {\n      return { height: arbitrarySize };\n    }\n\n    // Percentage heights: h-full, h-1/2, etc.\n    const percentage = SIZE_PERCENTAGES[sizeKey];\n    if (percentage) {\n      return { height: percentage };\n    }\n\n    // Numeric heights: h-4, h-8, etc. (includes custom spacing)\n    const numericSize = sizeMap[sizeKey];\n    if (numericSize !== undefined) {\n      return { height: numericSize };\n    }\n\n    // Special values\n    if (sizeKey === \"auto\") {\n      return { height: \"auto\" };\n    }\n  }\n\n  // Min width\n  if (cls.startsWith(\"min-w-\")) {\n    const sizeKey = cls.substring(6);\n\n    // Arbitrary values: min-w-[123px], min-w-[50%] (highest priority)\n    const arbitrarySize = parseArbitrarySize(sizeKey);\n    if (arbitrarySize !== null) {\n      return { minWidth: arbitrarySize };\n    }\n\n    const percentage = SIZE_PERCENTAGES[sizeKey];\n    if (percentage) {\n      return { minWidth: percentage };\n    }\n\n    const numericSize = sizeMap[sizeKey];\n    if (numericSize !== undefined) {\n      return { minWidth: numericSize };\n    }\n  }\n\n  // Min height\n  if (cls.startsWith(\"min-h-\")) {\n    const sizeKey = cls.substring(6);\n\n    // Arbitrary values: min-h-[123px], min-h-[50%] (highest priority)\n    const arbitrarySize = parseArbitrarySize(sizeKey);\n    if (arbitrarySize !== null) {\n      return { minHeight: arbitrarySize };\n    }\n\n    const percentage = SIZE_PERCENTAGES[sizeKey];\n    if (percentage) {\n      return { minHeight: percentage };\n    }\n\n    const numericSize = sizeMap[sizeKey];\n    if (numericSize !== undefined) {\n      return { minHeight: numericSize };\n    }\n  }\n\n  // Max width\n  if (cls.startsWith(\"max-w-\")) {\n    const sizeKey = cls.substring(6);\n\n    // Arbitrary values: max-w-[123px], max-w-[50%] (highest priority)\n    const arbitrarySize = parseArbitrarySize(sizeKey);\n    if (arbitrarySize !== null) {\n      return { maxWidth: arbitrarySize };\n    }\n\n    const percentage = SIZE_PERCENTAGES[sizeKey];\n    if (percentage) {\n      return { maxWidth: percentage };\n    }\n\n    const numericSize = sizeMap[sizeKey];\n    if (numericSize !== undefined) {\n      return { maxWidth: numericSize };\n    }\n  }\n\n  // Max height\n  if (cls.startsWith(\"max-h-\")) {\n    const sizeKey = cls.substring(6);\n\n    // Arbitrary values: max-h-[123px], max-h-[50%] (highest priority)\n    const arbitrarySize = parseArbitrarySize(sizeKey);\n    if (arbitrarySize !== null) {\n      return { maxHeight: arbitrarySize };\n    }\n\n    const percentage = SIZE_PERCENTAGES[sizeKey];\n    if (percentage) {\n      return { maxHeight: percentage };\n    }\n\n    const numericSize = sizeMap[sizeKey];\n    if (numericSize !== undefined) {\n      return { maxHeight: numericSize };\n    }\n  }\n\n  return null;\n}\n", "/**\n * Spacing utilities (margin, padding, gap)\n */\n\nimport type { StyleObject } from \"../types\";\n\n// Tailwind spacing scale (in pixels, converted to React Native units)\nexport const SPACING_SCALE: Record<string, number> = {\n  px: 1,\n  0: 0,\n  0.5: 2,\n  1: 4,\n  1.5: 6,\n  2: 8,\n  2.5: 10,\n  3: 12,\n  3.5: 14,\n  4: 16,\n  5: 20,\n  6: 24,\n  7: 28,\n  8: 32,\n  9: 36,\n  10: 40,\n  11: 44,\n  12: 48,\n  14: 56,\n  16: 64,\n  20: 80,\n  24: 96,\n  28: 112,\n  32: 128,\n  36: 144,\n  40: 160,\n  44: 176,\n  48: 192,\n  52: 208,\n  56: 224,\n  60: 240,\n  64: 256,\n  72: 288,\n  80: 320,\n  96: 384,\n};\n\n/**\n * Parse arbitrary spacing value: [16px], [20], [4.5px], [16.75]\n * Returns number for px values (including decimals), null for unsupported formats\n */\nfunction parseArbitrarySpacing(value: string): number | null {\n  // Match: [16px], [16], [4.5px], [4.5] (pixels, including decimals)\n  const pxMatch = value.match(/^\\[(-?\\d+(?:\\.\\d+)?)(?:px)?\\]$/);\n  if (pxMatch) {\n    return parseFloat(pxMatch[1]);\n  }\n\n  // Warn about unsupported formats\n  if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n    /* v8 ignore next 5 */\n    if (process.env.NODE_ENV !== \"production\") {\n      console.warn(\n        `[react-native-tailwind] Unsupported arbitrary spacing value: ${value}. Only px values are supported (e.g., [16px], [16], [4.5px], [4.5]).`,\n      );\n    }\n    return null;\n  }\n\n  return null;\n}\n\n/**\n * Parse spacing classes (margin, padding, gap)\n * Examples: m-4, mx-2, mt-8, p-4, px-2, pt-8, gap-4, m-[16px], pl-[4.5px], -m-4, -mt-[10px], ms-4, pe-2, mx-auto\n * @param cls - The class name to parse\n * @param customSpacing - Optional custom spacing values from tailwind.config\n */\nexport function parseSpacing(cls: string, customSpacing?: Record<string, number>): StyleObject | null {\n  // Merge custom spacing with defaults (custom takes precedence)\n  const spacingMap = customSpacing ? { ...SPACING_SCALE, ...customSpacing } : SPACING_SCALE;\n\n  // Auto margins: m-auto, mx-auto, my-auto, mt-auto, mr-auto, mb-auto, ml-auto, ms-auto, me-auto\n  // Note: Only margins support auto values (not padding or gap)\n  const autoMarginMatch = cls.match(/^m([xytrblse]?)-auto$/);\n  if (autoMarginMatch) {\n    const dir = autoMarginMatch[1];\n    return getMarginStyle(dir, \"auto\");\n  }\n\n  // Margin: m-4, mx-2, mt-8, ms-4, me-2, m-[16px], -m-4, -mt-2, etc.\n  // Supports negative values for margins (but not padding or gap)\n  // s = start (RTL-aware), e = end (RTL-aware)\n  const marginMatch = cls.match(/^(-?)m([xytrblse]?)-(.+)$/);\n  if (marginMatch) {\n    const [, negativePrefix, dir, valueStr] = marginMatch;\n    const isNegative = negativePrefix === \"-\";\n\n    // Try arbitrary value first (highest priority)\n    const arbitraryValue = parseArbitrarySpacing(valueStr);\n    if (arbitraryValue !== null) {\n      const finalValue = isNegative ? -arbitraryValue : arbitraryValue;\n      return getMarginStyle(dir, finalValue);\n    }\n\n    // Try spacing scale (includes custom spacing)\n    const scaleValue = spacingMap[valueStr];\n    if (scaleValue !== undefined) {\n      const finalValue = isNegative ? -scaleValue : scaleValue;\n      return getMarginStyle(dir, finalValue);\n    }\n  }\n\n  // Padding: p-4, px-2, pt-8, ps-4, pe-2, p-[16px], etc.\n  // s = start (RTL-aware), e = end (RTL-aware)\n  const paddingMatch = cls.match(/^p([xytrblse]?)-(.+)$/);\n  if (paddingMatch) {\n    const [, dir, valueStr] = paddingMatch;\n\n    // Try arbitrary value first (highest priority)\n    const arbitraryValue = parseArbitrarySpacing(valueStr);\n    if (arbitraryValue !== null) {\n      return getPaddingStyle(dir, arbitraryValue);\n    }\n\n    // Try spacing scale (includes custom spacing)\n    const scaleValue = spacingMap[valueStr];\n    if (scaleValue !== undefined) {\n      return getPaddingStyle(dir, scaleValue);\n    }\n  }\n\n  // Gap: gap-4, gap-[16px]\n  const gapMatch = cls.match(/^gap-(.+)$/);\n  if (gapMatch) {\n    const valueStr = gapMatch[1];\n\n    // Try arbitrary value first (highest priority)\n    const arbitraryValue = parseArbitrarySpacing(valueStr);\n    if (arbitraryValue !== null) {\n      return { gap: arbitraryValue };\n    }\n\n    // Try spacing scale (includes custom spacing)\n    const scaleValue = spacingMap[valueStr];\n    if (scaleValue !== undefined) {\n      return { gap: scaleValue };\n    }\n  }\n\n  return null;\n}\n\n/**\n * Get margin style object based on direction\n */\nfunction getMarginStyle(dir: string, value: number | \"auto\"): StyleObject {\n  switch (dir) {\n    case \"\":\n      return { margin: value };\n    case \"x\":\n      return { marginHorizontal: value };\n    case \"y\":\n      return { marginVertical: value };\n    case \"t\":\n      return { marginTop: value };\n    case \"r\":\n      return { marginRight: value };\n    case \"b\":\n      return { marginBottom: value };\n    case \"l\":\n      return { marginLeft: value };\n    case \"s\":\n      return { marginStart: value };\n    case \"e\":\n      return { marginEnd: value };\n    default:\n      return {};\n  }\n}\n\n/**\n * Get padding style object based on direction\n */\nfunction getPaddingStyle(dir: string, value: number): StyleObject {\n  switch (dir) {\n    case \"\":\n      return { padding: value };\n    case \"x\":\n      return { paddingHorizontal: value };\n    case \"y\":\n      return { paddingVertical: value };\n    case \"t\":\n      return { paddingTop: value };\n    case \"r\":\n      return { paddingRight: value };\n    case \"b\":\n      return { paddingBottom: value };\n    case \"l\":\n      return { paddingLeft: value };\n    case \"s\":\n      return { paddingStart: value };\n    case \"e\":\n      return { paddingEnd: value };\n    default:\n      return {};\n  }\n}\n", "/**\n * Transform utilities (scale, rotate, translate, skew, perspective)\n */\n\nimport type { StyleObject } from \"../types\";\nimport { SPACING_SCALE } from \"./spacing\";\n\n// Scale values (percentage to decimal)\nexport const SCALE_MAP: Record<string, number> = {\n  0: 0,\n  50: 0.5,\n  75: 0.75,\n  90: 0.9,\n  95: 0.95,\n  100: 1,\n  105: 1.05,\n  110: 1.1,\n  125: 1.25,\n  150: 1.5,\n  200: 2,\n};\n\n// Rotation degrees\nexport const ROTATE_MAP: Record<string, number> = {\n  0: 0,\n  1: 1,\n  2: 2,\n  3: 3,\n  6: 6,\n  12: 12,\n  45: 45,\n  90: 90,\n  180: 180,\n};\n\n// Skew degrees\nexport const SKEW_MAP: Record<string, number> = {\n  0: 0,\n  1: 1,\n  2: 2,\n  3: 3,\n  6: 6,\n  12: 12,\n};\n\n// Perspective values\nexport const PERSPECTIVE_SCALE: Record<string, number> = {\n  0: 0,\n  100: 100,\n  200: 200,\n  300: 300,\n  400: 400,\n  500: 500,\n  600: 600,\n  700: 700,\n  800: 800,\n  900: 900,\n  1000: 1000,\n};\n\n/**\n * Parse arbitrary scale value: [1.23], [0.5]\n * Returns number for valid scale, null otherwise\n */\nfunction parseArbitraryScale(value: string): number | null {\n  const scaleMatch = value.match(/^\\[(-?\\d+(?:\\.\\d+)?)\\]$/);\n  if (scaleMatch) {\n    return parseFloat(scaleMatch[1]);\n  }\n\n  // Unsupported format\n  if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n    /* v8 ignore next 5 */\n    if (process.env.NODE_ENV !== \"production\") {\n      console.warn(\n        `[react-native-tailwind] Invalid arbitrary scale value: ${value}. Only numbers are supported (e.g., [1.5], [0.75]).`,\n      );\n    }\n    return null;\n  }\n\n  return null;\n}\n\n/**\n * Parse arbitrary rotation value: [37deg], [-15deg]\n * Returns string for valid rotation, null otherwise\n */\nfunction parseArbitraryRotation(value: string): string | null {\n  const rotateMatch = value.match(/^\\[(-?\\d+(?:\\.\\d+)?)deg\\]$/);\n  if (rotateMatch) {\n    return `${rotateMatch[1]}deg`;\n  }\n\n  // Unsupported format\n  if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n    /* v8 ignore next 5 */\n    if (process.env.NODE_ENV !== \"production\") {\n      console.warn(\n        `[react-native-tailwind] Invalid arbitrary rotation value: ${value}. Only deg unit is supported (e.g., [45deg], [-15deg]).`,\n      );\n    }\n    return null;\n  }\n\n  return null;\n}\n\n/**\n * Parse arbitrary translation value: [123px], [123], [50%], [-10px]\n * Returns number for px values, string for % values, null for unsupported units\n */\nfunction parseArbitraryTranslation(value: string): number | string | null {\n  // Match: [123px], [123], [-123px], [-123] (pixels)\n  const pxMatch = value.match(/^\\[(-?\\d+)(?:px)?\\]$/);\n  if (pxMatch) {\n    return parseInt(pxMatch[1], 10);\n  }\n\n  // Match: [50%], [-50%] (percentage)\n  const percentMatch = value.match(/^\\[(-?\\d+(?:\\.\\d+)?)%\\]$/);\n  if (percentMatch) {\n    return `${percentMatch[1]}%`;\n  }\n\n  // Unsupported units\n  if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n    /* v8 ignore next 5 */\n    if (process.env.NODE_ENV !== \"production\") {\n      console.warn(\n        `[react-native-tailwind] Unsupported arbitrary translation unit: ${value}. Only px and % are supported.`,\n      );\n    }\n    return null;\n  }\n\n  return null;\n}\n\n/**\n * Parse arbitrary perspective value: [1500], [2000]\n * Returns number for valid perspective, null otherwise\n */\nfunction parseArbitraryPerspective(value: string): number | null {\n  const perspectiveMatch = value.match(/^\\[(-?\\d+)\\]$/);\n  if (perspectiveMatch) {\n    return parseInt(perspectiveMatch[1], 10);\n  }\n\n  // Unsupported format\n  if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n    /* v8 ignore next 5 */\n    if (process.env.NODE_ENV !== \"production\") {\n      console.warn(\n        `[react-native-tailwind] Invalid arbitrary perspective value: ${value}. Only integers are supported (e.g., [1500]).`,\n      );\n    }\n    return null;\n  }\n\n  return null;\n}\n\n/**\n * Parse transform classes\n * Each transform class returns a transform array with a single transform object\n * @param cls - The class name to parse\n * @param customSpacing - Optional custom spacing values from tailwind.config (for translate utilities)\n */\nexport function parseTransform(cls: string, customSpacing?: Record<string, number>): StyleObject | null {\n  // Merge custom spacing with defaults for translate utilities\n  const spacingMap = customSpacing ? { ...SPACING_SCALE, ...customSpacing } : SPACING_SCALE;\n  // Transform origin warning (not supported in React Native)\n  if (cls.startsWith(\"origin-\")) {\n    /* v8 ignore next 5 */\n    if (process.env.NODE_ENV !== \"production\") {\n      console.warn(\n        `[react-native-tailwind] transform-origin is not supported in React Native. Class \"${cls}\" will be ignored.`,\n      );\n    }\n    return null;\n  }\n\n  // Scale: scale-{value}\n  if (cls.startsWith(\"scale-\")) {\n    const scaleKey = cls.substring(6);\n\n    // Arbitrary values: scale-[1.23]\n    const arbitraryScale = parseArbitraryScale(scaleKey);\n    if (arbitraryScale !== null) {\n      return { transform: [{ scale: arbitraryScale }] };\n    }\n\n    const scaleValue = SCALE_MAP[scaleKey];\n    if (scaleValue !== undefined) {\n      return { transform: [{ scale: scaleValue }] };\n    }\n  }\n\n  // Scale X: scale-x-{value}\n  if (cls.startsWith(\"scale-x-\")) {\n    const scaleKey = cls.substring(8);\n\n    // Arbitrary values: scale-x-[1.5]\n    const arbitraryScale = parseArbitraryScale(scaleKey);\n    if (arbitraryScale !== null) {\n      return { transform: [{ scaleX: arbitraryScale }] };\n    }\n\n    const scaleValue = SCALE_MAP[scaleKey];\n    if (scaleValue !== undefined) {\n      return { transform: [{ scaleX: scaleValue }] };\n    }\n  }\n\n  // Scale Y: scale-y-{value}\n  if (cls.startsWith(\"scale-y-\")) {\n    const scaleKey = cls.substring(8);\n\n    // Arbitrary values: scale-y-[2.5]\n    const arbitraryScale = parseArbitraryScale(scaleKey);\n    if (arbitraryScale !== null) {\n      return { transform: [{ scaleY: arbitraryScale }] };\n    }\n\n    const scaleValue = SCALE_MAP[scaleKey];\n    if (scaleValue !== undefined) {\n      return { transform: [{ scaleY: scaleValue }] };\n    }\n  }\n\n  // Rotate: rotate-{degrees}, -rotate-{degrees}\n  if (cls.startsWith(\"rotate-\") || cls.startsWith(\"-rotate-\")) {\n    const isNegative = cls.startsWith(\"-\");\n    const rotateKey = isNegative ? cls.substring(8) : cls.substring(7);\n\n    // Arbitrary values: rotate-[37deg], -rotate-[15deg]\n    const arbitraryRotate = parseArbitraryRotation(rotateKey);\n    if (arbitraryRotate !== null) {\n      const degrees = isNegative ? `-${arbitraryRotate}` : arbitraryRotate;\n      return { transform: [{ rotate: degrees }] };\n    }\n\n    const rotateValue = ROTATE_MAP[rotateKey];\n    if (rotateValue !== undefined) {\n      const degrees = isNegative ? -rotateValue : rotateValue;\n      return { transform: [{ rotate: `${degrees}deg` }] };\n    }\n  }\n\n  // Rotate X: rotate-x-{degrees}, -rotate-x-{degrees}\n  if (cls.startsWith(\"rotate-x-\") || cls.startsWith(\"-rotate-x-\")) {\n    const isNegative = cls.startsWith(\"-\");\n    const rotateKey = isNegative ? cls.substring(10) : cls.substring(9);\n\n    // Arbitrary values\n    const arbitraryRotate = parseArbitraryRotation(rotateKey);\n    if (arbitraryRotate !== null) {\n      const degrees = isNegative ? `-${arbitraryRotate}` : arbitraryRotate;\n      return { transform: [{ rotateX: degrees }] };\n    }\n\n    const rotateValue = ROTATE_MAP[rotateKey];\n    if (rotateValue !== undefined) {\n      const degrees = isNegative ? -rotateValue : rotateValue;\n      return { transform: [{ rotateX: `${degrees}deg` }] };\n    }\n  }\n\n  // Rotate Y: rotate-y-{degrees}, -rotate-y-{degrees}\n  if (cls.startsWith(\"rotate-y-\") || cls.startsWith(\"-rotate-y-\")) {\n    const isNegative = cls.startsWith(\"-\");\n    const rotateKey = isNegative ? cls.substring(10) : cls.substring(9);\n\n    // Arbitrary values\n    const arbitraryRotate = parseArbitraryRotation(rotateKey);\n    if (arbitraryRotate !== null) {\n      const degrees = isNegative ? `-${arbitraryRotate}` : arbitraryRotate;\n      return { transform: [{ rotateY: degrees }] };\n    }\n\n    const rotateValue = ROTATE_MAP[rotateKey];\n    if (rotateValue !== undefined) {\n      const degrees = isNegative ? -rotateValue : rotateValue;\n      return { transform: [{ rotateY: `${degrees}deg` }] };\n    }\n  }\n\n  // Rotate Z: rotate-z-{degrees}, -rotate-z-{degrees}\n  if (cls.startsWith(\"rotate-z-\") || cls.startsWith(\"-rotate-z-\")) {\n    const isNegative = cls.startsWith(\"-\");\n    const rotateKey = isNegative ? cls.substring(10) : cls.substring(9);\n\n    // Arbitrary values\n    const arbitraryRotate = parseArbitraryRotation(rotateKey);\n    if (arbitraryRotate !== null) {\n      const degrees = isNegative ? `-${arbitraryRotate}` : arbitraryRotate;\n      return { transform: [{ rotateZ: degrees }] };\n    }\n\n    const rotateValue = ROTATE_MAP[rotateKey];\n    if (rotateValue !== undefined) {\n      const degrees = isNegative ? -rotateValue : rotateValue;\n      return { transform: [{ rotateZ: `${degrees}deg` }] };\n    }\n  }\n\n  // Translate X: translate-x-{spacing}, -translate-x-{spacing}\n  if (cls.startsWith(\"translate-x-\") || cls.startsWith(\"-translate-x-\")) {\n    const isNegative = cls.startsWith(\"-\");\n    const translateKey = isNegative ? cls.substring(13) : cls.substring(12);\n\n    // Arbitrary values: translate-x-[123px], -translate-x-[10px]\n    const arbitraryTranslate = parseArbitraryTranslation(translateKey);\n    if (arbitraryTranslate !== null) {\n      const value =\n        typeof arbitraryTranslate === \"number\"\n          ? isNegative\n            ? -arbitraryTranslate\n            : arbitraryTranslate\n          : isNegative\n            ? `-${arbitraryTranslate}`\n            : arbitraryTranslate;\n      return { transform: [{ translateX: value }] };\n    }\n\n    const translateValue = spacingMap[translateKey];\n    if (translateValue !== undefined) {\n      const value = isNegative ? -translateValue : translateValue;\n      return { transform: [{ translateX: value }] };\n    }\n  }\n\n  // Translate Y: translate-y-{spacing}, -translate-y-{spacing}\n  if (cls.startsWith(\"translate-y-\") || cls.startsWith(\"-translate-y-\")) {\n    const isNegative = cls.startsWith(\"-\");\n    const translateKey = isNegative ? cls.substring(13) : cls.substring(12);\n\n    // Arbitrary values: translate-y-[123px], -translate-y-[10px]\n    const arbitraryTranslate = parseArbitraryTranslation(translateKey);\n    if (arbitraryTranslate !== null) {\n      const value =\n        typeof arbitraryTranslate === \"number\"\n          ? isNegative\n            ? -arbitraryTranslate\n            : arbitraryTranslate\n          : isNegative\n            ? `-${arbitraryTranslate}`\n            : arbitraryTranslate;\n      return { transform: [{ translateY: value }] };\n    }\n\n    const translateValue = spacingMap[translateKey];\n    if (translateValue !== undefined) {\n      const value = isNegative ? -translateValue : translateValue;\n      return { transform: [{ translateY: value }] };\n    }\n  }\n\n  // Skew X: skew-x-{degrees}, -skew-x-{degrees}\n  if (cls.startsWith(\"skew-x-\") || cls.startsWith(\"-skew-x-\")) {\n    const isNegative = cls.startsWith(\"-\");\n    const skewKey = isNegative ? cls.substring(8) : cls.substring(7);\n\n    // Arbitrary values\n    const arbitrarySkew = parseArbitraryRotation(skewKey);\n    if (arbitrarySkew !== null) {\n      const degrees = isNegative ? `-${arbitrarySkew}` : arbitrarySkew;\n      return { transform: [{ skewX: degrees }] };\n    }\n\n    const skewValue = SKEW_MAP[skewKey];\n    if (skewValue !== undefined) {\n      const degrees = isNegative ? -skewValue : skewValue;\n      return { transform: [{ skewX: `${degrees}deg` }] };\n    }\n  }\n\n  // Skew Y: skew-y-{degrees}, -skew-y-{degrees}\n  if (cls.startsWith(\"skew-y-\") || cls.startsWith(\"-skew-y-\")) {\n    const isNegative = cls.startsWith(\"-\");\n    const skewKey = isNegative ? cls.substring(8) : cls.substring(7);\n\n    // Arbitrary values\n    const arbitrarySkew = parseArbitraryRotation(skewKey);\n    if (arbitrarySkew !== null) {\n      const degrees = isNegative ? `-${arbitrarySkew}` : arbitrarySkew;\n      return { transform: [{ skewY: degrees }] };\n    }\n\n    const skewValue = SKEW_MAP[skewKey];\n    if (skewValue !== undefined) {\n      const degrees = isNegative ? -skewValue : skewValue;\n      return { transform: [{ skewY: `${degrees}deg` }] };\n    }\n  }\n\n  // Perspective: perspective-{value}\n  if (cls.startsWith(\"perspective-\")) {\n    const perspectiveKey = cls.substring(12);\n\n    // Arbitrary values: perspective-[1500]\n    const arbitraryPerspective = parseArbitraryPerspective(perspectiveKey);\n    if (arbitraryPerspective !== null) {\n      return { transform: [{ perspective: arbitraryPerspective }] };\n    }\n\n    const perspectiveValue = PERSPECTIVE_SCALE[perspectiveKey];\n    if (perspectiveValue !== undefined) {\n      return { transform: [{ perspective: perspectiveValue }] };\n    }\n  }\n\n  return null;\n}\n", "/**\n * Typography utilities (font size, weight, line height, text align, letter spacing)\n */\n\nimport type { StyleObject } from \"../types\";\n\n// Font sizes\nexport const FONT_SIZES: Record<string, number> = {\n  xs: 12,\n  sm: 14,\n  base: 16,\n  lg: 18,\n  xl: 20,\n  \"2xl\": 24,\n  \"3xl\": 30,\n  \"4xl\": 36,\n  \"5xl\": 48,\n  \"6xl\": 60,\n  \"7xl\": 72,\n  \"8xl\": 96,\n  \"9xl\": 128,\n};\n\n// Letter spacing scale\nexport const LETTER_SPACING_SCALE: Record<string, number> = {\n  tighter: -0.8,\n  tight: -0.4,\n  normal: 0,\n  wide: 0.4,\n  wider: 0.8,\n  widest: 1.6,\n};\n\n// Font family utilities\nconst FONT_FAMILY_MAP: Record<string, StyleObject> = {\n  \"font-sans\": { fontFamily: \"System\" },\n  \"font-serif\": { fontFamily: \"serif\" },\n  \"font-mono\": { fontFamily: \"Courier\" },\n};\n\n// Font weight utilities\nconst FONT_WEIGHT_MAP: Record<string, StyleObject> = {\n  \"font-thin\": { fontWeight: \"100\" },\n  \"font-extralight\": { fontWeight: \"200\" },\n  \"font-light\": { fontWeight: \"300\" },\n  \"font-normal\": { fontWeight: \"400\" },\n  \"font-medium\": { fontWeight: \"500\" },\n  \"font-semibold\": { fontWeight: \"600\" },\n  \"font-bold\": { fontWeight: \"700\" },\n  \"font-extrabold\": { fontWeight: \"800\" },\n  \"font-black\": { fontWeight: \"900\" },\n};\n\n// Font style utilities\nconst FONT_STYLE_MAP: Record<string, StyleObject> = {\n  italic: { fontStyle: \"italic\" },\n  \"not-italic\": { fontStyle: \"normal\" },\n};\n\n// Text alignment utilities\n// Note: text-start and text-end are handled via automatic expansion to directional modifiers\n// in splitModifierClasses() for true RTL support:\n//   text-start -> ltr:text-left rtl:text-right\n//   text-end -> ltr:text-right rtl:text-left\nconst TEXT_ALIGN_MAP: Record<string, StyleObject> = {\n  \"text-left\": { textAlign: \"left\" },\n  \"text-center\": { textAlign: \"center\" },\n  \"text-right\": { textAlign: \"right\" },\n  \"text-justify\": { textAlign: \"justify\" },\n};\n\n// Text decoration utilities\nconst TEXT_DECORATION_MAP: Record<string, StyleObject> = {\n  underline: { textDecorationLine: \"underline\" },\n  \"line-through\": { textDecorationLine: \"line-through\" },\n  \"no-underline\": { textDecorationLine: \"none\" },\n};\n\n// Text transform utilities\nconst TEXT_TRANSFORM_MAP: Record<string, StyleObject> = {\n  uppercase: { textTransform: \"uppercase\" },\n  lowercase: { textTransform: \"lowercase\" },\n  capitalize: { textTransform: \"capitalize\" },\n  \"normal-case\": { textTransform: \"none\" },\n};\n\n// Line height scale (numeric)\nexport const LINE_HEIGHT_SCALE: Record<string, number> = {\n  3: 12,\n  4: 16,\n  5: 20,\n  6: 24,\n  7: 28,\n  8: 32,\n  9: 36,\n  10: 40,\n};\n\n// Line height utilities (named)\nconst LINE_HEIGHT_MAP: Record<string, StyleObject> = {\n  \"leading-none\": { lineHeight: 16 },\n  \"leading-tight\": { lineHeight: 20 },\n  \"leading-snug\": { lineHeight: 22 },\n  \"leading-normal\": { lineHeight: 24 },\n  \"leading-relaxed\": { lineHeight: 28 },\n  \"leading-loose\": { lineHeight: 32 },\n};\n\n// Letter spacing utilities\nconst TRACKING_MAP: Record<string, StyleObject> = {\n  \"tracking-tighter\": { letterSpacing: -0.8 },\n  \"tracking-tight\": { letterSpacing: -0.4 },\n  \"tracking-normal\": { letterSpacing: 0 },\n  \"tracking-wide\": { letterSpacing: 0.4 },\n  \"tracking-wider\": { letterSpacing: 0.8 },\n  \"tracking-widest\": { letterSpacing: 1.6 },\n};\n\n/**\n * Parse arbitrary font size value: [18px], [20], [13.5px], [.5]\n * Returns number for px values (including decimals), null for unsupported formats\n */\nfunction parseArbitraryFontSize(value: string): number | null {\n  // Match: [18px], [18], [13.5px], [13.5], [.5] (pixels, including decimals)\n  const pxMatch = value.match(/^\\[(-?\\d+(?:\\.\\d+)?|-?\\.\\d+)(?:px)?\\]$/);\n  if (pxMatch) {\n    return parseFloat(pxMatch[1]);\n  }\n\n  // Warn about unsupported formats\n  if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n    /* v8 ignore next 5 */\n    if (process.env.NODE_ENV !== \"production\") {\n      console.warn(\n        `[react-native-tailwind] Unsupported arbitrary font size value: ${value}. Only px values are supported (e.g., [18px], [13.5px], [.5]).`,\n      );\n    }\n    return null;\n  }\n\n  return null;\n}\n\n/**\n * Parse arbitrary line height value: [24px], [28], [21.5px], [.5]\n * Returns number for px values (including decimals), null for unsupported formats\n */\nfunction parseArbitraryLineHeight(value: string): number | null {\n  // Match: [24px], [24], [21.5px], [21.5], [.5] (pixels, including decimals)\n  const pxMatch = value.match(/^\\[(-?\\d+(?:\\.\\d+)?|-?\\.\\d+)(?:px)?\\]$/);\n  if (pxMatch) {\n    return parseFloat(pxMatch[1]);\n  }\n\n  // Warn about unsupported formats\n  if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n    /* v8 ignore next 5 */\n    if (process.env.NODE_ENV !== \"production\") {\n      console.warn(\n        `[react-native-tailwind] Unsupported arbitrary line height value: ${value}. Only px values are supported (e.g., [24px], [21.5px], [.5]).`,\n      );\n    }\n    return null;\n  }\n\n  return null;\n}\n\n/**\n * Parse arbitrary letter spacing value: [0.5px], [0.3], [.5], [-0.4]\n * Returns number for px values (including decimals), null for unsupported formats\n */\nfunction parseArbitraryLetterSpacing(value: string): number | null {\n  // Match: [0.5px], [0.3], [.5], [-0.4px] (pixels, including decimals and negatives)\n  const pxMatch = value.match(/^\\[(-?\\d+(?:\\.\\d+)?|-?\\.\\d+)(?:px)?\\]$/);\n  if (pxMatch) {\n    return parseFloat(pxMatch[1]);\n  }\n\n  // Warn about unsupported formats\n  if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n    /* v8 ignore next 5 */\n    if (process.env.NODE_ENV !== \"production\") {\n      console.warn(\n        `[react-native-tailwind] Unsupported arbitrary letter spacing value: ${value}. Only px values are supported (e.g., [0.5px], [0.3], [.5], [-0.4]).`,\n      );\n    }\n    return null;\n  }\n\n  return null;\n}\n\n/**\n * Parse typography classes\n * @param cls - Class name to parse\n * @param customFontFamily - Optional custom fontFamily from tailwind.config\n * @param customFontSize - Optional custom fontSize from tailwind.config\n */\nexport function parseTypography(\n  cls: string,\n  customFontFamily?: Record<string, string>,\n  customFontSize?: Record<string, number>,\n): StyleObject | null {\n  // Merge custom fontFamily with defaults (custom takes precedence)\n  const fontFamilyMap = customFontFamily\n    ? {\n        ...FONT_FAMILY_MAP,\n        ...Object.fromEntries(\n          Object.entries(customFontFamily).map(([key, value]) => [`font-${key}`, { fontFamily: value }]),\n        ),\n      }\n    : FONT_FAMILY_MAP;\n\n  // Font size: text-base, text-lg, text-[18px], etc.\n  if (cls.startsWith(\"text-\")) {\n    const sizeKey = cls.substring(5);\n\n    // Try arbitrary value first (highest priority)\n    const arbitraryValue = parseArbitraryFontSize(sizeKey);\n    if (arbitraryValue !== null) {\n      return { fontSize: arbitraryValue };\n    }\n\n    // Try custom fontSize from config\n    if (customFontSize?.[sizeKey] !== undefined) {\n      return { fontSize: customFontSize[sizeKey] };\n    }\n\n    // Try preset scale (fallback)\n    const fontSize = FONT_SIZES[sizeKey];\n    if (fontSize !== undefined) {\n      return { fontSize };\n    }\n  }\n\n  // Line height: leading-normal, leading-6, leading-[24px], etc.\n  if (cls.startsWith(\"leading-\")) {\n    const heightKey = cls.substring(8);\n\n    // Try arbitrary value first\n    const arbitraryValue = parseArbitraryLineHeight(heightKey);\n    if (arbitraryValue !== null) {\n      return { lineHeight: arbitraryValue };\n    }\n\n    // Try numeric scale (leading-3, leading-6, etc.)\n    const lineHeight = LINE_HEIGHT_SCALE[heightKey];\n    if (lineHeight !== undefined) {\n      return { lineHeight };\n    }\n  }\n\n  // Letter spacing: tracking-wide, tracking-[0.5px], tracking-[.3], etc.\n  if (cls.startsWith(\"tracking-\")) {\n    const trackingKey = cls.substring(9);\n\n    // Try arbitrary value first\n    const arbitraryValue = parseArbitraryLetterSpacing(trackingKey);\n    if (arbitraryValue !== null) {\n      return { letterSpacing: arbitraryValue };\n    }\n  }\n\n  // Try each lookup table in order\n  return (\n    fontFamilyMap[cls] ??\n    FONT_WEIGHT_MAP[cls] ??\n    FONT_STYLE_MAP[cls] ??\n    TEXT_ALIGN_MAP[cls] ??\n    TEXT_DECORATION_MAP[cls] ??\n    TEXT_TRANSFORM_MAP[cls] ??\n    LINE_HEIGHT_MAP[cls] ??\n    TRACKING_MAP[cls] ??\n    null\n  );\n}\n", "/**\n * Modifier parsing utilities for state-based, platform-specific, color scheme, and directional class names\n * - State modifiers: active:, hover:, focus:, disabled:, placeholder:\n * - Platform modifiers: ios:, android:, web:\n * - Color scheme modifiers: dark:, light:\n * - Directional modifiers: rtl:, ltr: (RTL-aware styling)\n */\n\nexport type StateModifierType = \"active\" | \"hover\" | \"focus\" | \"disabled\" | \"placeholder\";\nexport type PlatformModifierType = \"ios\" | \"android\" | \"web\";\nexport type ColorSchemeModifierType = \"dark\" | \"light\";\nexport type SchemeModifierType = \"scheme\";\nexport type DirectionalModifierType = \"rtl\" | \"ltr\";\nexport type ModifierType =\n  | StateModifierType\n  | PlatformModifierType\n  | ColorSchemeModifierType\n  | SchemeModifierType\n  | DirectionalModifierType;\n\nexport type ParsedModifier = {\n  modifier: ModifierType;\n  baseClass: string;\n};\n\n/**\n * Supported state modifiers that map to component states or pseudo-elements\n */\nconst STATE_MODIFIERS: readonly StateModifierType[] = [\n  \"active\",\n  \"hover\",\n  \"focus\",\n  \"disabled\",\n  \"placeholder\",\n] as const;\n\n/**\n * Supported platform modifiers that map to Platform.OS values\n */\nconst PLATFORM_MODIFIERS: readonly PlatformModifierType[] = [\"ios\", \"android\", \"web\"] as const;\n\n/**\n * Supported color scheme modifiers that map to Appearance.colorScheme values\n */\nconst COLOR_SCHEME_MODIFIERS: readonly ColorSchemeModifierType[] = [\"dark\", \"light\"] as const;\n\n/**\n * Scheme modifier that expands to both dark: and light: modifiers\n */\nconst SCHEME_MODIFIERS: readonly SchemeModifierType[] = [\"scheme\"] as const;\n\n/**\n * Supported directional modifiers that map to I18nManager.isRTL values\n */\nconst DIRECTIONAL_MODIFIERS: readonly DirectionalModifierType[] = [\"rtl\", \"ltr\"] as const;\n\n/**\n * All supported modifiers (state + platform + color scheme + scheme + directional)\n */\nconst SUPPORTED_MODIFIERS: readonly ModifierType[] = [\n  ...STATE_MODIFIERS,\n  ...PLATFORM_MODIFIERS,\n  ...COLOR_SCHEME_MODIFIERS,\n  ...SCHEME_MODIFIERS,\n  ...DIRECTIONAL_MODIFIERS,\n] as const;\n\n/**\n * Parse a class name to detect and extract modifiers\n *\n * @param cls - Class name to parse (e.g., \"active:bg-blue-500\")\n * @returns ParsedModifier if modifier found, null otherwise\n *\n * @example\n * parseModifier(\"active:bg-blue-500\") // { modifier: \"active\", baseClass: \"bg-blue-500\" }\n * parseModifier(\"bg-blue-500\") // null\n * parseModifier(\"hover:focus:bg-blue-500\") // null (nested modifiers not supported)\n */\nexport function parseModifier(cls: string): ParsedModifier | null {\n  const colonIndex = cls.indexOf(\":\");\n\n  // No colon means no modifier\n  if (colonIndex === -1) {\n    return null;\n  }\n\n  const potentialModifier = cls.slice(0, colonIndex);\n  const baseClass = cls.slice(colonIndex + 1);\n\n  // Check if it's a supported modifier\n  if (!SUPPORTED_MODIFIERS.includes(potentialModifier as ModifierType)) {\n    return null;\n  }\n\n  // Check for nested modifiers (not currently supported)\n  if (baseClass.includes(\":\")) {\n    return null;\n  }\n\n  // Base class must not be empty\n  if (!baseClass) {\n    return null;\n  }\n\n  return {\n    modifier: potentialModifier as ModifierType,\n    baseClass,\n  };\n}\n\n/**\n * Check if a class name contains a modifier\n *\n * @param cls - Class name to check\n * @returns true if class has a supported modifier prefix\n */\nexport function hasModifier(cls: string): boolean {\n  return parseModifier(cls) !== null;\n}\n\n/**\n * Check if a modifier is a state modifier (active, hover, focus, disabled, placeholder)\n *\n * @param modifier - Modifier type to check\n * @returns true if modifier is a state modifier\n */\nexport function isStateModifier(modifier: ModifierType): modifier is StateModifierType {\n  return STATE_MODIFIERS.includes(modifier as StateModifierType);\n}\n\n/**\n * Check if a modifier is a platform modifier (ios, android, web)\n *\n * @param modifier - Modifier type to check\n * @returns true if modifier is a platform modifier\n */\nexport function isPlatformModifier(modifier: ModifierType): modifier is PlatformModifierType {\n  return PLATFORM_MODIFIERS.includes(modifier as PlatformModifierType);\n}\n\n/**\n * Check if a modifier is a color scheme modifier (dark, light)\n *\n * @param modifier - Modifier type to check\n * @returns true if modifier is a color scheme modifier\n */\nexport function isColorSchemeModifier(modifier: ModifierType): modifier is ColorSchemeModifierType {\n  return COLOR_SCHEME_MODIFIERS.includes(modifier as ColorSchemeModifierType);\n}\n\n/**\n * Check if a modifier is a scheme modifier (scheme)\n *\n * @param modifier - Modifier type to check\n * @returns true if modifier is a scheme modifier\n */\nexport function isSchemeModifier(modifier: ModifierType): modifier is SchemeModifierType {\n  return SCHEME_MODIFIERS.includes(modifier as SchemeModifierType);\n}\n\n/**\n * Check if a modifier is a directional modifier (rtl, ltr)\n *\n * @param modifier - Modifier type to check\n * @returns true if modifier is a directional modifier\n */\nexport function isDirectionalModifier(modifier: ModifierType): modifier is DirectionalModifierType {\n  return DIRECTIONAL_MODIFIERS.includes(modifier as DirectionalModifierType);\n}\n\n/**\n * Check if a class name is a color-based utility class\n *\n * @param className - Class name to check\n * @returns true if class is color-based (text-*, bg-*, border-*)\n */\nexport function isColorClass(className: string): boolean {\n  return className.startsWith(\"text-\") || className.startsWith(\"bg-\") || className.startsWith(\"border-\");\n}\n\n/**\n * Expand scheme modifier into dark and light modifiers\n *\n * @param schemeModifier - Parsed scheme modifier\n * @param customColors - Custom colors from config\n * @param darkSuffix - Suffix for dark variant (default: \"-dark\")\n * @param lightSuffix - Suffix for light variant (default: \"-light\")\n * @returns Array of expanded modifiers (dark: and light:), or empty array if validation fails\n *\n * @example\n * expandSchemeModifier(\n *   { modifier: \"scheme\", baseClass: \"text-systemGray\" },\n *   { \"systemGray-dark\": \"#333\", \"systemGray-light\": \"#ccc\" },\n *   \"-dark\",\n *   \"-light\"\n * )\n * // Returns: [\n * //   { modifier: \"dark\", baseClass: \"text-systemGray-dark\" },\n * //   { modifier: \"light\", baseClass: \"text-systemGray-light\" }\n * // ]\n */\nexport function expandSchemeModifier(\n  schemeModifier: ParsedModifier,\n  customColors: Record<string, string>,\n  darkSuffix = \"-dark\",\n  lightSuffix = \"-light\",\n): ParsedModifier[] {\n  const { baseClass } = schemeModifier;\n\n  // Only process color-based classes\n  if (!isColorClass(baseClass)) {\n    if (process.env.NODE_ENV !== \"production\") {\n      console.warn(\n        `[react-native-tailwind] scheme: modifier only supports color classes (text-*, bg-*, border-*). ` +\n          `Found: \"${baseClass}\". This modifier will be ignored.`,\n      );\n    }\n    return [];\n  }\n\n  // Extract the color name from the class\n  // e.g., \"text-systemGray\" -> \"systemGray\"\n  const match = baseClass.match(/^(text|bg|border)-(.+)$/);\n  if (!match) {\n    return [];\n  }\n\n  const [, prefix, colorName] = match;\n\n  // Build variant class names\n  const darkColorName = `${colorName}${darkSuffix}`;\n  const lightColorName = `${colorName}${lightSuffix}`;\n\n  // Validate that both color variants exist\n  const darkColorExists = customColors[darkColorName] !== undefined;\n  const lightColorExists = customColors[lightColorName] !== undefined;\n\n  if (!darkColorExists || !lightColorExists) {\n    if (process.env.NODE_ENV !== \"production\") {\n      const missing = [];\n      if (!darkColorExists) missing.push(`${colorName}${darkSuffix}`);\n      if (!lightColorExists) missing.push(`${colorName}${lightSuffix}`);\n      console.warn(\n        `[react-native-tailwind] scheme:${baseClass} requires both color variants to exist. ` +\n          `Missing: ${missing.join(\", \")}. This modifier will be ignored.`,\n      );\n    }\n    return [];\n  }\n\n  // Expand to dark: and light: modifiers\n  return [\n    {\n      modifier: \"dark\" as ColorSchemeModifierType,\n      baseClass: `${prefix}-${darkColorName}`,\n    },\n    {\n      modifier: \"light\" as ColorSchemeModifierType,\n      baseClass: `${prefix}-${lightColorName}`,\n    },\n  ];\n}\n\n/**\n * Classes that expand to directional modifiers for true RTL support\n * text-start -> ltr:text-left rtl:text-right (start = left in LTR, right in RTL)\n * text-end -> ltr:text-right rtl:text-left (end = right in LTR, left in RTL)\n */\nconst DIRECTIONAL_TEXT_ALIGN_EXPANSIONS: Record<string, { ltr: string; rtl: string }> = {\n  \"text-start\": { ltr: \"text-left\", rtl: \"text-right\" },\n  \"text-end\": { ltr: \"text-right\", rtl: \"text-left\" },\n};\n\n/**\n * Check if a class should be expanded to directional modifiers\n *\n * @param cls - Class name to check\n * @returns Expansion object if class should expand, undefined otherwise\n */\nexport function getDirectionalExpansion(cls: string): { ltr: string; rtl: string } | undefined {\n  return DIRECTIONAL_TEXT_ALIGN_EXPANSIONS[cls];\n}\n\n/**\n * Split a space-separated className string into base and modifier classes\n *\n * @param className - Space-separated class names\n * @returns Object with baseClasses and modifierClasses arrays\n *\n * @example\n * splitModifierClasses(\"bg-blue-500 active:bg-blue-700 p-4 active:p-6\")\n * // {\n * //   baseClasses: [\"bg-blue-500\", \"p-4\"],\n * //   modifierClasses: [\n * //     { modifier: \"active\", baseClass: \"bg-blue-700\" },\n * //     { modifier: \"active\", baseClass: \"p-6\" }\n * //   ]\n * // }\n *\n * @example\n * // text-start/text-end auto-expand to directional modifiers for true RTL support\n * splitModifierClasses(\"text-start p-4\")\n * // {\n * //   baseClasses: [\"p-4\"],\n * //   modifierClasses: [\n * //     { modifier: \"ltr\", baseClass: \"text-left\" },\n * //     { modifier: \"rtl\", baseClass: \"text-right\" }\n * //   ]\n * // }\n */\nexport function splitModifierClasses(className: string): {\n  baseClasses: string[];\n  modifierClasses: ParsedModifier[];\n} {\n  const classes = className.trim().split(/\\s+/).filter(Boolean);\n  const baseClasses: string[] = [];\n  const modifierClasses: ParsedModifier[] = [];\n\n  for (const cls of classes) {\n    // Check for directional text alignment expansion (text-start, text-end)\n    const directionalExpansion = getDirectionalExpansion(cls);\n    if (directionalExpansion) {\n      // Expand to ltr: and rtl: modifiers for true RTL support\n      modifierClasses.push({ modifier: \"ltr\", baseClass: directionalExpansion.ltr });\n      modifierClasses.push({ modifier: \"rtl\", baseClass: directionalExpansion.rtl });\n      continue;\n    }\n\n    const parsed = parseModifier(cls);\n    if (parsed) {\n      modifierClasses.push(parsed);\n    } else {\n      baseClasses.push(cls);\n    }\n  }\n\n  return { baseClasses, modifierClasses };\n}\n", "/**\n * Tailwind class parser for React Native\n * Converts Tailwind-like class names to React Native style objects\n */\n\nimport type { StyleObject } from \"../types\";\nimport { mergeStyles } from \"../utils/mergeStyles\";\nimport { parseAspectRatio } from \"./aspectRatio\";\nimport { parseBorder } from \"./borders\";\nimport { parseColor } from \"./colors\";\nimport { parseLayout } from \"./layout\";\nimport { parseOutline } from \"./outline\";\nimport { parseShadow } from \"./shadows\";\nimport { parseSizing } from \"./sizing\";\nimport { parseSpacing } from \"./spacing\";\nimport { parseTransform } from \"./transforms\";\nimport { parseTypography } from \"./typography\";\n\n/**\n * Custom theme configuration (subset of tailwind.config theme extensions)\n */\nexport type CustomTheme = {\n  colors?: Record<string, string>;\n  fontFamily?: Record<string, string>;\n  fontSize?: Record<string, number>;\n  spacing?: Record<string, number>;\n};\n\n/**\n * Parse a className string and return a React Native style object\n * @param className - Space-separated class names\n * @param customTheme - Optional custom theme from tailwind.config\n * @returns React Native style object\n */\nexport function parseClassName(className: string, customTheme?: CustomTheme): StyleObject {\n  const classes = className.split(/\\s+/).filter(Boolean);\n  const style: StyleObject = {};\n\n  for (const cls of classes) {\n    const parsedStyle = parseClass(cls, customTheme);\n    mergeStyles(style, parsedStyle);\n  }\n\n  return style;\n}\n\n/**\n * Parse a single class name\n * @param cls - Single class name\n * @param customTheme - Optional custom theme from tailwind.config\n * @returns React Native style object\n */\nexport function parseClass(cls: string, customTheme?: CustomTheme): StyleObject {\n  // Try each parser in order\n  // Note: parseBorder must come before parseColor to avoid border-[3px] being parsed as a color\n  // Parsers receive relevant custom theme properties\n  const parsers: Array<(cls: string) => StyleObject | null> = [\n    (cls: string) => parseSpacing(cls, customTheme?.spacing),\n    (cls: string) => parseBorder(cls, customTheme?.colors),\n    parseOutline,\n    (cls: string) => parseColor(cls, customTheme?.colors),\n    (cls: string) => parseLayout(cls, customTheme?.spacing),\n    (cls: string) => parseTypography(cls, customTheme?.fontFamily, customTheme?.fontSize),\n    (cls: string) => parseSizing(cls, customTheme?.spacing),\n    (cls: string) => parseShadow(cls, customTheme?.colors),\n    parseAspectRatio,\n    (cls: string) => parseTransform(cls, customTheme?.spacing),\n  ];\n\n  for (const parser of parsers) {\n    const result = parser(cls);\n    if (result !== null) {\n      return result;\n    }\n  }\n\n  // Warn about unknown class in development\n  /* v8 ignore next 3 */\n  if (process.env.NODE_ENV !== \"production\") {\n    console.warn(`[react-native-tailwind] Unknown class: \"${cls}\"`);\n  }\n\n  return {};\n}\n\n// Re-export parsers for testing/advanced usage\nexport { parseAspectRatio } from \"./aspectRatio\";\nexport { parseBorder } from \"./borders\";\nexport { parseColor } from \"./colors\";\nexport { parseLayout } from \"./layout\";\nexport { parseOutline } from \"./outline\";\nexport { parsePlaceholderClass, parsePlaceholderClasses } from \"./placeholder\";\nexport { parseShadow } from \"./shadows\";\nexport { parseSizing } from \"./sizing\";\nexport { parseSpacing } from \"./spacing\";\nexport { parseTransform } from \"./transforms\";\nexport { parseTypography } from \"./typography\";\n\n// Re-export modifier utilities\nexport {\n  expandSchemeModifier,\n  hasModifier,\n  isColorClass,\n  isColorSchemeModifier,\n  isDirectionalModifier,\n  isPlatformModifier,\n  isSchemeModifier,\n  isStateModifier,\n  parseModifier,\n  splitModifierClasses,\n} from \"./modifiers\";\nexport type {\n  ColorSchemeModifierType,\n  DirectionalModifierType,\n  ModifierType,\n  ParsedModifier,\n  PlatformModifierType,\n  SchemeModifierType,\n  StateModifierType,\n} from \"./modifiers\";\n", "/**\n * Shared utilities for parsing state modifiers (active:, focus:, disabled:)\n * Used by both runtime parser and Babel plugin\n */\n\n// Supported state modifiers for Pressable/TextInput components\nexport const SUPPORTED_MODIFIERS = [\"active\", \"focus\", \"disabled\"] as const;\nexport type SupportedModifier = (typeof SUPPORTED_MODIFIERS)[number];\n\n/**\n * Detect if a className contains any state modifiers (active:, focus:, disabled:)\n */\nexport function hasModifiers(className: string): boolean {\n  return SUPPORTED_MODIFIERS.some((modifier) => className.includes(`${modifier}:`));\n}\n\n/**\n * Split className into base classes and modifier-specific classes\n * Returns: { base: string[], modifiers: Map<modifier, string[]> }\n *\n * @example\n * splitModifierClasses('bg-blue-500 active:bg-blue-700 disabled:bg-gray-300')\n * // Returns:\n * // {\n * //   base: ['bg-blue-500'],\n * //   modifiers: Map {\n * //     'active' => ['bg-blue-700'],\n * //     'disabled' => ['bg-gray-300']\n * //   }\n * // }\n */\nexport function splitModifierClasses(className: string): {\n  base: string[];\n  modifiers: Map<SupportedModifier, string[]>;\n} {\n  const classes = className.split(/\\s+/).filter(Boolean);\n  const base: string[] = [];\n  const modifiers = new Map<SupportedModifier, string[]>();\n\n  for (const cls of classes) {\n    let matched = false;\n    for (const modifier of SUPPORTED_MODIFIERS) {\n      const prefix = `${modifier}:`;\n      if (cls.startsWith(prefix)) {\n        const cleanClass = cls.slice(prefix.length);\n        if (!modifiers.has(modifier)) {\n          modifiers.set(modifier, []);\n        }\n        const modifierClasses = modifiers.get(modifier);\n        if (modifierClasses) {\n          modifierClasses.push(cleanClass);\n        }\n        matched = true;\n        break;\n      }\n    }\n    if (!matched) {\n      base.push(cls);\n    }\n  }\n\n  return { base, modifiers };\n}\n"],
  "mappings": "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ACP,IAAO,UACP,IAAO,UACP,IAAO,SACT,EACA,KAAM,CACJ,GAAM,UACN,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,SACT,EACA,IAAK,CACH,GAAM,UACN,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,SACT,EACA,KAAM,CACJ,GAAM,UACN,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,SACT,EACA,OAAQ,CACN,GAAM,UACN,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,SACT,EACA,OAAQ,CACN,GAAM,UACN,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,SACT,EACA,OAAQ,CACN,GAAM,UACN,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,SACT,EACA,QAAS,CACP,GAAM,UACN,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,SACT,EACA,KAAM,CACJ,GAAM,UACN,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,SACT,EACA,KAAM,CACJ,GAAM,UACN,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,UACP,IAAO,SACT,EACA,MAAO,CACL,GAAM,UACN,IAAO,UACP,IAAO,U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",
  "names": ["runtime_exports", "__export", "clearCache", "getCacheStats", "getCustomColors", "getCustomTheme", "setConfig", "tw", "twStyle", "__toCommonJS", "getTransformType", "transform", "mergeTransforms", "target", "source", "result", "sourceTransform", "sourceType", "existingIndex", "t", "mergeStyles", "key", "sourceValue", "targetValue", "ASPECT_RATIO_PRESETS", "parseArbitraryAspectRatio", "value", "match", "numerator", "denominator", "parseAspectRatio", "cls", "aspectRatio", "arbitraryValue", "TAILWIND_COLORS", "flattenColors", "colors", "prefix", "result", "key", "value", "newKey", "COLORS", "__spreadProps", "__spreadValues", "flattenColors", "TAILWIND_COLORS", "applyOpacity", "hex", "opacity", "cleanHex", "fullHex", "char", "alphaHex", "parseArbitraryColor", "value", "hexMatch", "parseColorValue", "colorKey", "customColors", "_a", "getColor", "key", "opacityMatch", "baseColorKey", "arbitraryColor", "color", "parseColor", "cls", "customColors", "getColor", "key", "_a", "COLORS", "parseColorWithOpacity", "colorKey", "opacityMatch", "baseColorKey", "opacity", "arbitraryColor", "parseArbitraryColor", "applyOpacity", "color", "dirBorderMatch", "dir", "BORDER_WIDTH_SCALE", "BORDER_RADIUS_SCALE", "BORDER_WIDTH_PROP_MAP", "BORDER_RADIUS_CORNER_MAP", "BORDER_RADIUS_LOGICAL_CORNER_MAP", "BORDER_RADIUS_SIDE_MAP", "parseArbitraryBorderWidth", "value", "pxMatch", "parseArbitraryBorderRadius", "parseBorder", "cls", "customColors", "parseBorderWidth", "parseBorderRadius", "dirMatch", "dir", "valueStr", "parseColor", "arbitraryValue", "scaleValue", "allMatch", "allArbMatch", "withoutPrefix", "rest", "cornerMatch", "corner", "logicalCornerMatch", "sideMatch", "side", "result", "prop", "parseArbitraryInset", "value", "pxMatch", "percentMatch", "parseArbitraryZIndex", "zMatch", "parseArbitraryGrowShrink", "match", "DISPLAY_MAP", "FLEX_DIRECTION_MAP", "FLEX_WRAP_MAP", "FLEX_MAP", "GROW_SHRINK_MAP", "JUSTIFY_CONTENT_MAP", "ALIGN_ITEMS_MAP", "ALIGN_SELF_MAP", "ALIGN_CONTENT_MAP", "POSITION_MAP", "OVERFLOW_MAP", "OPACITY_MAP", "Z_INDEX_SCALE", "INSET_SCALE", "parseLayout", "cls", "customSpacing", "_a", "_b", "_c", "_d", "_e", "_f", "_g", "_h", "_i", "_j", "_k", "_l", "insetMap", "__spreadValues", "zKey", "arbitraryZ", "zValue", "topMatch", "negPrefix", "topKey", "isNegative", "arbitraryTop", "topValue", "rightMatch", "rightKey", "arbitraryRight", "rightValue", "bottomMatch", "bottomKey", "arbitraryBottom", "bottomValue", "leftMatch", "leftKey", "arbitraryLeft", "leftValue", "startMatch", "startKey", "arbitraryStart", "startValue", "endMatch", "endKey", "arbitraryEnd", "endValue", "insetKey", "arbitraryInset", "insetValue", "prefix", "growKey", "arbitraryGrow", "shrinkKey", "arbitraryShrink", "parseArbitraryOutlineValue", "value", "pxMatch", "parseOutline", "cls", "valueStr", "arbitraryValue", "scaleValue", "BORDER_WIDTH_SCALE", "widthMatch", "arbMatch", "SHADOW_SCALE", "parseShadow", "cls", "customColors", "colorPart", "shadowColor", "parseColorValue", "RUNTIME_DIMENSIONS_MARKER", "SIZE_SCALE", "SIZE_PERCENTAGES", "parseArbitrarySize", "value", "pxMatch", "percentMatch", "parseSizing", "cls", "customSpacing", "sizeMap", "__spreadValues", "sizeKey", "arbitrarySize", "percentage", "numericSize", "RUNTIME_DIMENSIONS_MARKER", "SPACING_SCALE", "parseArbitrarySpacing", "value", "pxMatch", "parseSpacing", "cls", "customSpacing", "spacingMap", "__spreadValues", "autoMarginMatch", "dir", "getMarginStyle", "marginMatch", "negativePrefix", "valueStr", "isNegative", "arbitraryValue", "finalValue", "scaleValue", "paddingMatch", "getPaddingStyle", "gapMatch", "SCALE_MAP", "ROTATE_MAP", "SKEW_MAP", "PERSPECTIVE_SCALE", "parseArbitraryScale", "value", "scaleMatch", "parseArbitraryRotation", "rotateMatch", "parseArbitraryTranslation", "pxMatch", "percentMatch", "parseArbitraryPerspective", "perspectiveMatch", "parseTransform", "cls", "customSpacing", "spacingMap", "__spreadValues", "SPACING_SCALE", "scaleKey", "arbitraryScale", "scaleValue", "isNegative", "rotateKey", "arbitraryRotate", "rotateValue", "translateKey", "arbitraryTranslate", "translateValue", "skewKey", "arbitrarySkew", "skewValue", "perspectiveKey", "arbitraryPerspective", "perspectiveValue", "FONT_SIZES", "FONT_FAMILY_MAP", "FONT_WEIGHT_MAP", "FONT_STYLE_MAP", "TEXT_ALIGN_MAP", "TEXT_DECORATION_MAP", "TEXT_TRANSFORM_MAP", "LINE_HEIGHT_SCALE", "LINE_HEIGHT_MAP", "TRACKING_MAP", "parseArbitraryFontSize", "value", "pxMatch", "parseArbitraryLineHeight", "parseArbitraryLetterSpacing", "parseTypography", "cls", "customFontFamily", "customFontSize", "_a", "_b", "_c", "_d", "_e", "_f", "_g", "_h", "fontFamilyMap", "__spreadValues", "key", "sizeKey", "arbitraryValue", "fontSize", "FONT_SIZES", "heightKey", "lineHeight", "trackingKey", "STATE_MODIFIERS", "PLATFORM_MODIFIERS", "COLOR_SCHEME_MODIFIERS", "SCHEME_MODIFIERS", "DIRECTIONAL_MODIFIERS", "SUPPORTED_MODIFIERS", "parseClassName", "className", "customTheme", "classes", "style", "cls", "parsedStyle", "parseClass", "mergeStyles", "parsers", "parseSpacing", "parseBorder", "parseOutline", "parseColor", "parseLayout", "parseTypography", "parseSizing", "parseShadow", "parseAspectRatio", "parseTransform", "parser", "result", "SUPPORTED_MODIFIERS", "hasModifiers", "className", "modifier", "splitModifierClasses", "classes", "base", "modifiers", "cls", "matched", "prefix", "cleanClass", "modifierClasses", "globalCustomTheme", "styleCache", "setConfig", "config", "_a", "_b", "_c", "_d", "_e", "_f", "_g", "_h", "_i", "flattenColors", "fontFamilyResult", "key", "value", "fontSizeResult", "parsed", "spacingResult", "getCustomTheme", "getCustomColors", "clearCache", "getCacheStats", "parseAndCache", "className", "cached", "hasModifiers", "result", "parseClassName", "base", "modifiers", "splitModifierClasses", "baseClassName", "activeClasses", "activeClassName", "focusClasses", "focusClassName", "disabledClasses", "disabledClassName", "tw", "strings", "values", "normalizedClassName", "acc", "str", "i", "valueStr", "twStyle"]
}
