@mgcrea/react-native-tailwind 0.9.1 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +386 -43
  2. package/dist/babel/config-loader.d.ts +12 -3
  3. package/dist/babel/config-loader.test.ts +154 -0
  4. package/dist/babel/config-loader.ts +41 -9
  5. package/dist/babel/index.cjs +592 -69
  6. package/dist/babel/plugin.d.ts +23 -1
  7. package/dist/babel/plugin.test.ts +331 -0
  8. package/dist/babel/plugin.ts +268 -37
  9. package/dist/babel/utils/colorSchemeModifierProcessing.d.ts +34 -0
  10. package/dist/babel/utils/colorSchemeModifierProcessing.ts +89 -0
  11. package/dist/babel/utils/dynamicProcessing.d.ts +34 -3
  12. package/dist/babel/utils/dynamicProcessing.ts +358 -39
  13. package/dist/babel/utils/modifierProcessing.d.ts +3 -3
  14. package/dist/babel/utils/modifierProcessing.ts +5 -5
  15. package/dist/babel/utils/platformModifierProcessing.d.ts +3 -3
  16. package/dist/babel/utils/platformModifierProcessing.ts +4 -4
  17. package/dist/babel/utils/styleInjection.d.ts +13 -0
  18. package/dist/babel/utils/styleInjection.ts +101 -0
  19. package/dist/babel/utils/styleTransforms.test.ts +56 -0
  20. package/dist/babel/utils/twProcessing.d.ts +5 -3
  21. package/dist/babel/utils/twProcessing.ts +27 -6
  22. package/dist/parser/index.d.ts +13 -6
  23. package/dist/parser/index.js +1 -1
  24. package/dist/parser/modifiers.d.ts +48 -2
  25. package/dist/parser/modifiers.js +1 -1
  26. package/dist/parser/modifiers.test.js +1 -1
  27. package/dist/parser/typography.d.ts +3 -1
  28. package/dist/parser/typography.js +1 -1
  29. package/dist/runtime.cjs +1 -1
  30. package/dist/runtime.cjs.map +3 -3
  31. package/dist/runtime.d.ts +8 -1
  32. package/dist/runtime.js +1 -1
  33. package/dist/runtime.js.map +3 -3
  34. package/dist/runtime.test.js +1 -1
  35. package/dist/types/config.d.ts +7 -0
  36. package/dist/types/config.js +0 -0
  37. package/package.json +3 -2
  38. package/src/babel/config-loader.test.ts +154 -0
  39. package/src/babel/config-loader.ts +41 -9
  40. package/src/babel/plugin.test.ts +331 -0
  41. package/src/babel/plugin.ts +268 -37
  42. package/src/babel/utils/colorSchemeModifierProcessing.ts +89 -0
  43. package/src/babel/utils/dynamicProcessing.ts +358 -39
  44. package/src/babel/utils/modifierProcessing.ts +5 -5
  45. package/src/babel/utils/platformModifierProcessing.ts +4 -4
  46. package/src/babel/utils/styleInjection.ts +101 -0
  47. package/src/babel/utils/styleTransforms.test.ts +56 -0
  48. package/src/babel/utils/twProcessing.ts +27 -6
  49. package/src/parser/index.ts +28 -9
  50. package/src/parser/modifiers.test.ts +151 -1
  51. package/src/parser/modifiers.ts +139 -4
  52. package/src/parser/typography.ts +14 -2
  53. package/src/runtime.test.ts +7 -7
  54. package/src/runtime.ts +37 -14
  55. package/src/types/config.ts +7 -0
@@ -64,6 +64,107 @@ export function addPlatformImport(path: NodePath<BabelTypes.Program>, t: typeof
64
64
  }
65
65
  }
66
66
 
67
+ /**
68
+ * Add useColorScheme import to the file or merge with existing react-native import
69
+ */
70
+ export function addColorSchemeImport(path: NodePath<BabelTypes.Program>, t: typeof BabelTypes): void {
71
+ // Check if there's already a react-native import
72
+ const body = path.node.body;
73
+ let reactNativeImport: BabelTypes.ImportDeclaration | null = null;
74
+
75
+ for (const statement of body) {
76
+ if (t.isImportDeclaration(statement) && statement.source.value === "react-native") {
77
+ reactNativeImport = statement;
78
+ break;
79
+ }
80
+ }
81
+
82
+ if (reactNativeImport) {
83
+ // Check if useColorScheme is already imported
84
+ const hasUseColorScheme = reactNativeImport.specifiers.some(
85
+ (spec) =>
86
+ t.isImportSpecifier(spec) &&
87
+ spec.imported.type === "Identifier" &&
88
+ spec.imported.name === "useColorScheme",
89
+ );
90
+
91
+ if (!hasUseColorScheme) {
92
+ // Add useColorScheme to existing react-native import
93
+ reactNativeImport.specifiers.push(
94
+ t.importSpecifier(t.identifier("useColorScheme"), t.identifier("useColorScheme")),
95
+ );
96
+ }
97
+ } else {
98
+ // Create new react-native import with useColorScheme
99
+ const importDeclaration = t.importDeclaration(
100
+ [t.importSpecifier(t.identifier("useColorScheme"), t.identifier("useColorScheme"))],
101
+ t.stringLiteral("react-native"),
102
+ );
103
+ path.unshiftContainer("body", importDeclaration);
104
+ }
105
+ }
106
+
107
+ /**
108
+ * Inject useColorScheme hook call at the top of a function component
109
+ *
110
+ * @param functionPath - Path to the function component
111
+ * @param colorSchemeVariableName - Name for the color scheme variable
112
+ * @param t - Babel types
113
+ * @returns true if hook was injected, false if already exists
114
+ */
115
+ export function injectColorSchemeHook(
116
+ functionPath: NodePath<BabelTypes.Function>,
117
+ colorSchemeVariableName: string,
118
+ t: typeof BabelTypes,
119
+ ): boolean {
120
+ let body = functionPath.node.body;
121
+
122
+ // Handle concise arrow functions: () => <JSX />
123
+ // Convert to block statement: () => { const _twColorScheme = useColorScheme(); return <JSX />; }
124
+ if (!t.isBlockStatement(body)) {
125
+ if (t.isArrowFunctionExpression(functionPath.node) && t.isExpression(body)) {
126
+ // Convert concise body to block statement with return
127
+ const returnStatement = t.returnStatement(body);
128
+ const blockStatement = t.blockStatement([returnStatement]);
129
+ functionPath.node.body = blockStatement;
130
+ body = blockStatement;
131
+ } else {
132
+ // Other non-block functions (shouldn't happen for components, but be safe)
133
+ return false;
134
+ }
135
+ }
136
+
137
+ // Check if hook is already injected
138
+ const hasHook = body.body.some((statement) => {
139
+ if (
140
+ t.isVariableDeclaration(statement) &&
141
+ statement.declarations.length > 0 &&
142
+ t.isVariableDeclarator(statement.declarations[0])
143
+ ) {
144
+ const declarator = statement.declarations[0];
145
+ return t.isIdentifier(declarator.id) && declarator.id.name === colorSchemeVariableName;
146
+ }
147
+ return false;
148
+ });
149
+
150
+ if (hasHook) {
151
+ return false; // Already injected
152
+ }
153
+
154
+ // Create: const _twColorScheme = useColorScheme();
155
+ const hookCall = t.variableDeclaration("const", [
156
+ t.variableDeclarator(
157
+ t.identifier(colorSchemeVariableName),
158
+ t.callExpression(t.identifier("useColorScheme"), []),
159
+ ),
160
+ ]);
161
+
162
+ // Insert at the beginning of function body
163
+ body.body.unshift(hookCall);
164
+
165
+ return true;
166
+ }
167
+
67
168
  /**
68
169
  * Inject StyleSheet.create with all collected styles at the top of the file
69
170
  * This ensures the styles object is defined before any code that references it
@@ -347,3 +347,59 @@ describe("Style merging - edge cases", () => {
347
347
  expect(output).not.toContain("className");
348
348
  });
349
349
  });
350
+
351
+ describe("Style function merging - mergeStyleFunctionAttribute", () => {
352
+ it("should merge modifier className with existing function style prop", () => {
353
+ const input = `
354
+ import { Pressable } from 'react-native';
355
+ export function Component() {
356
+ return (
357
+ <Pressable
358
+ className="bg-blue-500 active:bg-blue-700"
359
+ style={({ pressed }) => pressed && { opacity: 0.8 }}
360
+ />
361
+ );
362
+ }
363
+ `;
364
+
365
+ const output = transform(input);
366
+
367
+ // Should create wrapper function that merges both style functions
368
+ expect(output).toContain("_state");
369
+ expect(output).toMatch(/_state\s*=>/);
370
+
371
+ // Should call both the new style function and existing style function
372
+ expect(output).toContain("_bg_blue_500");
373
+ expect(output).toContain("_active_bg_blue_700");
374
+
375
+ // Should not have className in output
376
+ expect(output).not.toContain("className");
377
+ });
378
+
379
+ it("should merge modifier className with static existing style when using Pressable", () => {
380
+ const input = `
381
+ import { Pressable } from 'react-native';
382
+ export function Component() {
383
+ return (
384
+ <Pressable
385
+ className="p-4 active:bg-gray-100"
386
+ style={{ borderRadius: 8 }}
387
+ />
388
+ );
389
+ }
390
+ `;
391
+
392
+ const output = transform(input);
393
+
394
+ // Should create function that wraps className styles
395
+ expect(output).toContain("_state");
396
+
397
+ // Should include both the className styles and the static style
398
+ expect(output).toContain("_p_4");
399
+ expect(output).toContain("_active_bg_gray_100");
400
+ expect(output).toContain("borderRadius");
401
+
402
+ // Should not have className in output
403
+ expect(output).not.toContain("className");
404
+ });
405
+ });
@@ -3,21 +3,23 @@
3
3
  */
4
4
  import type { NodePath } from "@babel/core";
5
5
  import type * as BabelTypes from "@babel/types";
6
- import type { ParsedModifier } from "../../parser/index.js";
6
+ import type { CustomTheme, ParsedModifier } from "../../parser/index.js";
7
+ import type { SchemeModifierConfig } from "../../types/config.js";
7
8
  import type { StyleObject } from "../../types/core.js";
8
9
  /**
9
10
  * Plugin state interface (subset needed for tw processing)
10
11
  */
11
12
  export interface TwProcessingState {
12
13
  styleRegistry: Map<string, StyleObject>;
13
- customColors: Record<string, string>;
14
+ customTheme: CustomTheme;
15
+ schemeModifierConfig: SchemeModifierConfig;
14
16
  stylesIdentifier: string;
15
17
  }
16
18
  /**
17
19
  * Process tw`...` or twStyle('...') call and replace with TwStyle object
18
20
  * Generates: { style: styles._base, activeStyle: styles._active, ... }
19
21
  */
20
- export declare function processTwCall(className: string, path: NodePath, state: TwProcessingState, parseClassName: (className: string, customColors: Record<string, string>) => StyleObject, generateStyleKey: (className: string) => string, splitModifierClasses: (className: string) => {
22
+ export declare function processTwCall(className: string, path: NodePath, state: TwProcessingState, parseClassName: (className: string, customTheme?: CustomTheme) => StyleObject, generateStyleKey: (className: string) => string, splitModifierClasses: (className: string) => {
21
23
  baseClasses: string[];
22
24
  modifierClasses: ParsedModifier[];
23
25
  }, t: typeof BabelTypes): void;
@@ -4,7 +4,9 @@
4
4
 
5
5
  import type { NodePath } from "@babel/core";
6
6
  import type * as BabelTypes from "@babel/types";
7
- import type { ModifierType, ParsedModifier } from "../../parser/index.js";
7
+ import type { CustomTheme, ModifierType, ParsedModifier } from "../../parser/index.js";
8
+ import { expandSchemeModifier, isSchemeModifier } from "../../parser/index.js";
9
+ import type { SchemeModifierConfig } from "../../types/config.js";
8
10
  import type { StyleObject } from "../../types/core.js";
9
11
 
10
12
  /**
@@ -13,7 +15,8 @@ import type { StyleObject } from "../../types/core.js";
13
15
  // eslint-disable-next-line @typescript-eslint/consistent-type-definitions
14
16
  export interface TwProcessingState {
15
17
  styleRegistry: Map<string, StyleObject>;
16
- customColors: Record<string, string>;
18
+ customTheme: CustomTheme;
19
+ schemeModifierConfig: SchemeModifierConfig;
17
20
  stylesIdentifier: string;
18
21
  }
19
22
 
@@ -25,12 +28,30 @@ export function processTwCall(
25
28
  className: string,
26
29
  path: NodePath,
27
30
  state: TwProcessingState,
28
- parseClassName: (className: string, customColors: Record<string, string>) => StyleObject,
31
+ parseClassName: (className: string, customTheme?: CustomTheme) => StyleObject,
29
32
  generateStyleKey: (className: string) => string,
30
33
  splitModifierClasses: (className: string) => { baseClasses: string[]; modifierClasses: ParsedModifier[] },
31
34
  t: typeof BabelTypes,
32
35
  ): void {
33
- const { baseClasses, modifierClasses } = splitModifierClasses(className);
36
+ const { baseClasses, modifierClasses: rawModifierClasses } = splitModifierClasses(className);
37
+
38
+ // Expand scheme: modifiers into dark: and light: modifiers
39
+ const modifierClasses: ParsedModifier[] = [];
40
+ for (const modifier of rawModifierClasses) {
41
+ if (isSchemeModifier(modifier.modifier)) {
42
+ // Expand scheme: into dark: and light:
43
+ const expanded = expandSchemeModifier(
44
+ modifier,
45
+ state.customTheme.colors ?? {},
46
+ state.schemeModifierConfig.darkSuffix ?? "-dark",
47
+ state.schemeModifierConfig.lightSuffix ?? "-light",
48
+ );
49
+ modifierClasses.push(...expanded);
50
+ } else {
51
+ // Keep other modifiers as-is
52
+ modifierClasses.push(modifier);
53
+ }
54
+ }
34
55
 
35
56
  // Build TwStyle object properties
36
57
  const objectProperties: BabelTypes.ObjectProperty[] = [];
@@ -38,7 +59,7 @@ export function processTwCall(
38
59
  // Parse and add base styles
39
60
  if (baseClasses.length > 0) {
40
61
  const baseClassName = baseClasses.join(" ");
41
- const baseStyleObject = parseClassName(baseClassName, state.customColors);
62
+ const baseStyleObject = parseClassName(baseClassName, state.customTheme);
42
63
  const baseStyleKey = generateStyleKey(baseClassName);
43
64
  state.styleRegistry.set(baseStyleKey, baseStyleObject);
44
65
 
@@ -68,7 +89,7 @@ export function processTwCall(
68
89
  // Add modifier styles
69
90
  for (const [modifierType, modifiers] of modifiersByType) {
70
91
  const modifierClassNames = modifiers.map((m) => m.baseClass).join(" ");
71
- const modifierStyleObject = parseClassName(modifierClassNames, state.customColors);
92
+ const modifierStyleObject = parseClassName(modifierClassNames, state.customTheme);
72
93
  const modifierStyleKey = generateStyleKey(`${modifierType}_${modifierClassNames}`);
73
94
  state.styleRegistry.set(modifierStyleKey, modifierStyleObject);
74
95
 
@@ -3,20 +3,27 @@
3
3
  * Converts Tailwind-like class names to React Native style objects
4
4
  */
5
5
  import type { StyleObject } from "../types";
6
+ /**
7
+ * Custom theme configuration (subset of tailwind.config theme extensions)
8
+ */
9
+ export type CustomTheme = {
10
+ colors?: Record<string, string>;
11
+ fontFamily?: Record<string, string>;
12
+ };
6
13
  /**
7
14
  * Parse a className string and return a React Native style object
8
15
  * @param className - Space-separated class names
9
- * @param customColors - Optional custom colors from tailwind.config
16
+ * @param customTheme - Optional custom theme from tailwind.config
10
17
  * @returns React Native style object
11
18
  */
12
- export declare function parseClassName(className: string, customColors?: Record<string, string>): StyleObject;
19
+ export declare function parseClassName(className: string, customTheme?: CustomTheme): StyleObject;
13
20
  /**
14
21
  * Parse a single class name
15
22
  * @param cls - Single class name
16
- * @param customColors - Optional custom colors from tailwind.config
23
+ * @param customTheme - Optional custom theme from tailwind.config
17
24
  * @returns React Native style object
18
25
  */
19
- export declare function parseClass(cls: string, customColors?: Record<string, string>): StyleObject;
26
+ export declare function parseClass(cls: string, customTheme?: CustomTheme): StyleObject;
20
27
  export { parseAspectRatio } from "./aspectRatio";
21
28
  export { parseBorder } from "./borders";
22
29
  export { parseColor } from "./colors";
@@ -27,5 +34,5 @@ export { parseSizing } from "./sizing";
27
34
  export { parseSpacing } from "./spacing";
28
35
  export { parseTransform } from "./transforms";
29
36
  export { parseTypography } from "./typography";
30
- export { hasModifier, isPlatformModifier, isStateModifier, parseModifier, splitModifierClasses, } from "./modifiers";
31
- export type { ModifierType, ParsedModifier, PlatformModifierType, StateModifierType } from "./modifiers";
37
+ export { expandSchemeModifier, hasModifier, isColorClass, isColorSchemeModifier, isPlatformModifier, isSchemeModifier, isStateModifier, parseModifier, splitModifierClasses, } from "./modifiers";
38
+ export type { ColorSchemeModifierType, ModifierType, ParsedModifier, PlatformModifierType, SchemeModifierType, StateModifierType, } from "./modifiers";
@@ -1 +1 @@
1
- Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"hasModifier",{enumerable:true,get:function get(){return _modifiers.hasModifier;}});Object.defineProperty(exports,"isPlatformModifier",{enumerable:true,get:function get(){return _modifiers.isPlatformModifier;}});Object.defineProperty(exports,"isStateModifier",{enumerable:true,get:function get(){return _modifiers.isStateModifier;}});Object.defineProperty(exports,"parseAspectRatio",{enumerable:true,get:function get(){return _aspectRatio.parseAspectRatio;}});Object.defineProperty(exports,"parseBorder",{enumerable:true,get:function get(){return _borders.parseBorder;}});exports.parseClass=parseClass;exports.parseClassName=parseClassName;Object.defineProperty(exports,"parseColor",{enumerable:true,get:function get(){return _colors.parseColor;}});Object.defineProperty(exports,"parseLayout",{enumerable:true,get:function get(){return _layout.parseLayout;}});Object.defineProperty(exports,"parseModifier",{enumerable:true,get:function get(){return _modifiers.parseModifier;}});Object.defineProperty(exports,"parsePlaceholderClass",{enumerable:true,get:function get(){return _placeholder.parsePlaceholderClass;}});Object.defineProperty(exports,"parsePlaceholderClasses",{enumerable:true,get:function get(){return _placeholder.parsePlaceholderClasses;}});Object.defineProperty(exports,"parseShadow",{enumerable:true,get:function get(){return _shadows.parseShadow;}});Object.defineProperty(exports,"parseSizing",{enumerable:true,get:function get(){return _sizing.parseSizing;}});Object.defineProperty(exports,"parseSpacing",{enumerable:true,get:function get(){return _spacing.parseSpacing;}});Object.defineProperty(exports,"parseTransform",{enumerable:true,get:function get(){return _transforms.parseTransform;}});Object.defineProperty(exports,"parseTypography",{enumerable:true,get:function get(){return _typography.parseTypography;}});Object.defineProperty(exports,"splitModifierClasses",{enumerable:true,get:function get(){return _modifiers.splitModifierClasses;}});var _aspectRatio=require("./aspectRatio");var _borders=require("./borders");var _colors=require("./colors");var _layout=require("./layout");var _shadows=require("./shadows");var _sizing=require("./sizing");var _spacing=require("./spacing");var _transforms=require("./transforms");var _typography=require("./typography");var _placeholder=require("./placeholder");var _modifiers=require("./modifiers");function parseClassName(className,customColors){var classes=className.split(/\s+/).filter(Boolean);var style={};for(var cls of classes){var parsedStyle=parseClass(cls,customColors);Object.assign(style,parsedStyle);}return style;}function parseClass(cls,customColors){var parsers=[_spacing.parseSpacing,_borders.parseBorder,function(cls){return(0,_colors.parseColor)(cls,customColors);},_layout.parseLayout,_typography.parseTypography,_sizing.parseSizing,_shadows.parseShadow,_aspectRatio.parseAspectRatio,_transforms.parseTransform];for(var parser of parsers){var result=parser(cls);if(result!==null){return result;}}if(process.env.NODE_ENV!=="production"){console.warn(`[react-native-tailwind] Unknown class: "${cls}"`);}return{};}
1
+ Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"expandSchemeModifier",{enumerable:true,get:function get(){return _modifiers.expandSchemeModifier;}});Object.defineProperty(exports,"hasModifier",{enumerable:true,get:function get(){return _modifiers.hasModifier;}});Object.defineProperty(exports,"isColorClass",{enumerable:true,get:function get(){return _modifiers.isColorClass;}});Object.defineProperty(exports,"isColorSchemeModifier",{enumerable:true,get:function get(){return _modifiers.isColorSchemeModifier;}});Object.defineProperty(exports,"isPlatformModifier",{enumerable:true,get:function get(){return _modifiers.isPlatformModifier;}});Object.defineProperty(exports,"isSchemeModifier",{enumerable:true,get:function get(){return _modifiers.isSchemeModifier;}});Object.defineProperty(exports,"isStateModifier",{enumerable:true,get:function get(){return _modifiers.isStateModifier;}});Object.defineProperty(exports,"parseAspectRatio",{enumerable:true,get:function get(){return _aspectRatio.parseAspectRatio;}});Object.defineProperty(exports,"parseBorder",{enumerable:true,get:function get(){return _borders.parseBorder;}});exports.parseClass=parseClass;exports.parseClassName=parseClassName;Object.defineProperty(exports,"parseColor",{enumerable:true,get:function get(){return _colors.parseColor;}});Object.defineProperty(exports,"parseLayout",{enumerable:true,get:function get(){return _layout.parseLayout;}});Object.defineProperty(exports,"parseModifier",{enumerable:true,get:function get(){return _modifiers.parseModifier;}});Object.defineProperty(exports,"parsePlaceholderClass",{enumerable:true,get:function get(){return _placeholder.parsePlaceholderClass;}});Object.defineProperty(exports,"parsePlaceholderClasses",{enumerable:true,get:function get(){return _placeholder.parsePlaceholderClasses;}});Object.defineProperty(exports,"parseShadow",{enumerable:true,get:function get(){return _shadows.parseShadow;}});Object.defineProperty(exports,"parseSizing",{enumerable:true,get:function get(){return _sizing.parseSizing;}});Object.defineProperty(exports,"parseSpacing",{enumerable:true,get:function get(){return _spacing.parseSpacing;}});Object.defineProperty(exports,"parseTransform",{enumerable:true,get:function get(){return _transforms.parseTransform;}});Object.defineProperty(exports,"parseTypography",{enumerable:true,get:function get(){return _typography.parseTypography;}});Object.defineProperty(exports,"splitModifierClasses",{enumerable:true,get:function get(){return _modifiers.splitModifierClasses;}});var _aspectRatio=require("./aspectRatio");var _borders=require("./borders");var _colors=require("./colors");var _layout=require("./layout");var _shadows=require("./shadows");var _sizing=require("./sizing");var _spacing=require("./spacing");var _transforms=require("./transforms");var _typography=require("./typography");var _placeholder=require("./placeholder");var _modifiers=require("./modifiers");function parseClassName(className,customTheme){var classes=className.split(/\s+/).filter(Boolean);var style={};for(var cls of classes){var parsedStyle=parseClass(cls,customTheme);Object.assign(style,parsedStyle);}return style;}function parseClass(cls,customTheme){var parsers=[_spacing.parseSpacing,_borders.parseBorder,function(cls){return(0,_colors.parseColor)(cls,customTheme==null?void 0:customTheme.colors);},_layout.parseLayout,function(cls){return(0,_typography.parseTypography)(cls,customTheme==null?void 0:customTheme.fontFamily);},_sizing.parseSizing,_shadows.parseShadow,_aspectRatio.parseAspectRatio,_transforms.parseTransform];for(var parser of parsers){var result=parser(cls);if(result!==null){return result;}}if(process.env.NODE_ENV!=="production"){console.warn(`[react-native-tailwind] Unknown class: "${cls}"`);}return{};}
@@ -1,11 +1,14 @@
1
1
  /**
2
- * Modifier parsing utilities for state-based and platform-specific class names
2
+ * Modifier parsing utilities for state-based, platform-specific, and color scheme class names
3
3
  * - State modifiers: active:, hover:, focus:, disabled:, placeholder:
4
4
  * - Platform modifiers: ios:, android:, web:
5
+ * - Color scheme modifiers: dark:, light:
5
6
  */
6
7
  export type StateModifierType = "active" | "hover" | "focus" | "disabled" | "placeholder";
7
8
  export type PlatformModifierType = "ios" | "android" | "web";
8
- export type ModifierType = StateModifierType | PlatformModifierType;
9
+ export type ColorSchemeModifierType = "dark" | "light";
10
+ export type SchemeModifierType = "scheme";
11
+ export type ModifierType = StateModifierType | PlatformModifierType | ColorSchemeModifierType | SchemeModifierType;
9
12
  export type ParsedModifier = {
10
13
  modifier: ModifierType;
11
14
  baseClass: string;
@@ -43,6 +46,49 @@ export declare function isStateModifier(modifier: ModifierType): modifier is Sta
43
46
  * @returns true if modifier is a platform modifier
44
47
  */
45
48
  export declare function isPlatformModifier(modifier: ModifierType): modifier is PlatformModifierType;
49
+ /**
50
+ * Check if a modifier is a color scheme modifier (dark, light)
51
+ *
52
+ * @param modifier - Modifier type to check
53
+ * @returns true if modifier is a color scheme modifier
54
+ */
55
+ export declare function isColorSchemeModifier(modifier: ModifierType): modifier is ColorSchemeModifierType;
56
+ /**
57
+ * Check if a modifier is a scheme modifier (scheme)
58
+ *
59
+ * @param modifier - Modifier type to check
60
+ * @returns true if modifier is a scheme modifier
61
+ */
62
+ export declare function isSchemeModifier(modifier: ModifierType): modifier is SchemeModifierType;
63
+ /**
64
+ * Check if a class name is a color-based utility class
65
+ *
66
+ * @param className - Class name to check
67
+ * @returns true if class is color-based (text-*, bg-*, border-*)
68
+ */
69
+ export declare function isColorClass(className: string): boolean;
70
+ /**
71
+ * Expand scheme modifier into dark and light modifiers
72
+ *
73
+ * @param schemeModifier - Parsed scheme modifier
74
+ * @param customColors - Custom colors from config
75
+ * @param darkSuffix - Suffix for dark variant (default: "-dark")
76
+ * @param lightSuffix - Suffix for light variant (default: "-light")
77
+ * @returns Array of expanded modifiers (dark: and light:), or empty array if validation fails
78
+ *
79
+ * @example
80
+ * expandSchemeModifier(
81
+ * { modifier: "scheme", baseClass: "text-systemGray" },
82
+ * { "systemGray-dark": "#333", "systemGray-light": "#ccc" },
83
+ * "-dark",
84
+ * "-light"
85
+ * )
86
+ * // Returns: [
87
+ * // { modifier: "dark", baseClass: "text-systemGray-dark" },
88
+ * // { modifier: "light", baseClass: "text-systemGray-light" }
89
+ * // ]
90
+ */
91
+ export declare function expandSchemeModifier(schemeModifier: ParsedModifier, customColors: Record<string, string>, darkSuffix?: string, lightSuffix?: string): ParsedModifier[];
46
92
  /**
47
93
  * Split a space-separated className string into base and modifier classes
48
94
  *
@@ -1 +1 @@
1
- Object.defineProperty(exports,"__esModule",{value:true});exports.hasModifier=hasModifier;exports.isPlatformModifier=isPlatformModifier;exports.isStateModifier=isStateModifier;exports.parseModifier=parseModifier;exports.splitModifierClasses=splitModifierClasses;var STATE_MODIFIERS=["active","hover","focus","disabled","placeholder"];var PLATFORM_MODIFIERS=["ios","android","web"];var SUPPORTED_MODIFIERS=[].concat(STATE_MODIFIERS,PLATFORM_MODIFIERS);function parseModifier(cls){var colonIndex=cls.indexOf(":");if(colonIndex===-1){return null;}var potentialModifier=cls.slice(0,colonIndex);var baseClass=cls.slice(colonIndex+1);if(!SUPPORTED_MODIFIERS.includes(potentialModifier)){return null;}if(baseClass.includes(":")){return null;}if(!baseClass){return null;}return{modifier:potentialModifier,baseClass:baseClass};}function hasModifier(cls){return parseModifier(cls)!==null;}function isStateModifier(modifier){return STATE_MODIFIERS.includes(modifier);}function isPlatformModifier(modifier){return PLATFORM_MODIFIERS.includes(modifier);}function splitModifierClasses(className){var classes=className.trim().split(/\s+/).filter(Boolean);var baseClasses=[];var modifierClasses=[];for(var cls of classes){var parsed=parseModifier(cls);if(parsed){modifierClasses.push(parsed);}else{baseClasses.push(cls);}}return{baseClasses:baseClasses,modifierClasses:modifierClasses};}
1
+ var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.expandSchemeModifier=expandSchemeModifier;exports.hasModifier=hasModifier;exports.isColorClass=isColorClass;exports.isColorSchemeModifier=isColorSchemeModifier;exports.isPlatformModifier=isPlatformModifier;exports.isSchemeModifier=isSchemeModifier;exports.isStateModifier=isStateModifier;exports.parseModifier=parseModifier;exports.splitModifierClasses=splitModifierClasses;var _slicedToArray2=_interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));var STATE_MODIFIERS=["active","hover","focus","disabled","placeholder"];var PLATFORM_MODIFIERS=["ios","android","web"];var COLOR_SCHEME_MODIFIERS=["dark","light"];var SCHEME_MODIFIERS=["scheme"];var SUPPORTED_MODIFIERS=[].concat(STATE_MODIFIERS,PLATFORM_MODIFIERS,COLOR_SCHEME_MODIFIERS,SCHEME_MODIFIERS);function parseModifier(cls){var colonIndex=cls.indexOf(":");if(colonIndex===-1){return null;}var potentialModifier=cls.slice(0,colonIndex);var baseClass=cls.slice(colonIndex+1);if(!SUPPORTED_MODIFIERS.includes(potentialModifier)){return null;}if(baseClass.includes(":")){return null;}if(!baseClass){return null;}return{modifier:potentialModifier,baseClass:baseClass};}function hasModifier(cls){return parseModifier(cls)!==null;}function isStateModifier(modifier){return STATE_MODIFIERS.includes(modifier);}function isPlatformModifier(modifier){return PLATFORM_MODIFIERS.includes(modifier);}function isColorSchemeModifier(modifier){return COLOR_SCHEME_MODIFIERS.includes(modifier);}function isSchemeModifier(modifier){return SCHEME_MODIFIERS.includes(modifier);}function isColorClass(className){return className.startsWith("text-")||className.startsWith("bg-")||className.startsWith("border-");}function expandSchemeModifier(schemeModifier,customColors){var darkSuffix=arguments.length>2&&arguments[2]!==undefined?arguments[2]:"-dark";var lightSuffix=arguments.length>3&&arguments[3]!==undefined?arguments[3]:"-light";var baseClass=schemeModifier.baseClass;if(!isColorClass(baseClass)){if(process.env.NODE_ENV!=="production"){console.warn(`[react-native-tailwind] scheme: modifier only supports color classes (text-*, bg-*, border-*). `+`Found: "${baseClass}". This modifier will be ignored.`);}return[];}var match=baseClass.match(/^(text|bg|border)-(.+)$/);if(!match){return[];}var _match=(0,_slicedToArray2.default)(match,3),prefix=_match[1],colorName=_match[2];var darkColorName=`${colorName}${darkSuffix}`;var lightColorName=`${colorName}${lightSuffix}`;var darkColorExists=customColors[darkColorName]!==undefined;var lightColorExists=customColors[lightColorName]!==undefined;if(!darkColorExists||!lightColorExists){if(process.env.NODE_ENV!=="production"){var missing=[];if(!darkColorExists)missing.push(`${colorName}${darkSuffix}`);if(!lightColorExists)missing.push(`${colorName}${lightSuffix}`);console.warn(`[react-native-tailwind] scheme:${baseClass} requires both color variants to exist. `+`Missing: ${missing.join(", ")}. This modifier will be ignored.`);}return[];}return[{modifier:"dark",baseClass:`${prefix}-${darkColorName}`},{modifier:"light",baseClass:`${prefix}-${lightColorName}`}];}function splitModifierClasses(className){var classes=className.trim().split(/\s+/).filter(Boolean);var baseClasses=[];var modifierClasses=[];for(var cls of classes){var parsed=parseModifier(cls);if(parsed){modifierClasses.push(parsed);}else{baseClasses.push(cls);}}return{baseClasses:baseClasses,modifierClasses:modifierClasses};}
@@ -1 +1 @@
1
- var _vitest=require("vitest");var _modifiers=require("./modifiers");(0,_vitest.describe)("parseModifier - basic functionality",function(){(0,_vitest.it)("should parse active modifier",function(){var result=(0,_modifiers.parseModifier)("active:bg-blue-500");(0,_vitest.expect)(result).toEqual({modifier:"active",baseClass:"bg-blue-500"});});(0,_vitest.it)("should parse hover modifier",function(){var result=(0,_modifiers.parseModifier)("hover:text-red-500");(0,_vitest.expect)(result).toEqual({modifier:"hover",baseClass:"text-red-500"});});(0,_vitest.it)("should parse focus modifier",function(){var result=(0,_modifiers.parseModifier)("focus:border-green-500");(0,_vitest.expect)(result).toEqual({modifier:"focus",baseClass:"border-green-500"});});(0,_vitest.it)("should parse disabled modifier",function(){var result=(0,_modifiers.parseModifier)("disabled:bg-gray-400");(0,_vitest.expect)(result).toEqual({modifier:"disabled",baseClass:"bg-gray-400"});});(0,_vitest.it)("should return null for class without modifier",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)("bg-blue-500")).toBeNull();(0,_vitest.expect)((0,_modifiers.parseModifier)("text-red-500")).toBeNull();(0,_vitest.expect)((0,_modifiers.parseModifier)("p-4")).toBeNull();});});(0,_vitest.describe)("parseModifier - various base classes",function(){(0,_vitest.it)("should parse modifiers with spacing classes",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)("active:m-4")).toEqual({modifier:"active",baseClass:"m-4"});(0,_vitest.expect)((0,_modifiers.parseModifier)("hover:p-8")).toEqual({modifier:"hover",baseClass:"p-8"});});(0,_vitest.it)("should parse modifiers with layout classes",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)("active:flex")).toEqual({modifier:"active",baseClass:"flex"});(0,_vitest.expect)((0,_modifiers.parseModifier)("focus:absolute")).toEqual({modifier:"focus",baseClass:"absolute"});});(0,_vitest.it)("should parse modifiers with typography classes",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)("hover:text-lg")).toEqual({modifier:"hover",baseClass:"text-lg"});(0,_vitest.expect)((0,_modifiers.parseModifier)("active:font-bold")).toEqual({modifier:"active",baseClass:"font-bold"});});(0,_vitest.it)("should parse modifiers with arbitrary values",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)("active:bg-[#ff0000]")).toEqual({modifier:"active",baseClass:"bg-[#ff0000]"});(0,_vitest.expect)((0,_modifiers.parseModifier)("hover:w-[100px]")).toEqual({modifier:"hover",baseClass:"w-[100px]"});});(0,_vitest.it)("should parse modifiers with complex class names",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)("active:inset-x-4")).toEqual({modifier:"active",baseClass:"inset-x-4"});(0,_vitest.expect)((0,_modifiers.parseModifier)("focus:border-blue-500")).toEqual({modifier:"focus",baseClass:"border-blue-500"});});});(0,_vitest.describe)("parseModifier - edge cases",function(){(0,_vitest.it)("should return null for unsupported modifiers",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)("selected:bg-blue-500")).toBeNull();(0,_vitest.expect)((0,_modifiers.parseModifier)("pressed:bg-red-500")).toBeNull();(0,_vitest.expect)((0,_modifiers.parseModifier)("custom:bg-green-500")).toBeNull();(0,_vitest.expect)((0,_modifiers.parseModifier)("unknown:bg-gray-500")).toBeNull();});(0,_vitest.it)("should return null for nested modifiers",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)("active:hover:bg-blue-500")).toBeNull();(0,_vitest.expect)((0,_modifiers.parseModifier)("hover:focus:text-red-500")).toBeNull();(0,_vitest.expect)((0,_modifiers.parseModifier)("focus:active:p-4")).toBeNull();});(0,_vitest.it)("should return null for empty base class",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)("active:")).toBeNull();(0,_vitest.expect)((0,_modifiers.parseModifier)("hover:")).toBeNull();(0,_vitest.expect)((0,_modifiers.parseModifier)("focus:")).toBeNull();});(0,_vitest.it)("should return null for empty modifier",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)(":bg-blue-500")).toBeNull();(0,_vitest.expect)((0,_modifiers.parseModifier)(":")).toBeNull();});(0,_vitest.it)("should return null for class with only colon",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)(":")).toBeNull();});(0,_vitest.it)("should return null for class with multiple colons but no modifier",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)("bg:blue:500")).toBeNull();});(0,_vitest.it)("should handle base classes that look like they have colons",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)("active:some:thing")).toBeNull();});(0,_vitest.it)("should return null for empty string",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)("")).toBeNull();});});(0,_vitest.describe)("parseModifier - case sensitivity",function(){(0,_vitest.it)("should be case-sensitive for modifiers",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)("Active:bg-blue-500")).toBeNull();(0,_vitest.expect)((0,_modifiers.parseModifier)("ACTIVE:bg-blue-500")).toBeNull();(0,_vitest.expect)((0,_modifiers.parseModifier)("Hover:text-red-500")).toBeNull();(0,_vitest.expect)((0,_modifiers.parseModifier)("FOCUS:border-green-500")).toBeNull();});(0,_vitest.it)("should preserve case in base class",function(){var result=(0,_modifiers.parseModifier)("active:bg-Blue-500");(0,_vitest.expect)(result).toEqual({modifier:"active",baseClass:"bg-Blue-500"});});});(0,_vitest.describe)("hasModifier",function(){(0,_vitest.it)("should return true for classes with modifiers",function(){(0,_vitest.expect)((0,_modifiers.hasModifier)("active:bg-blue-500")).toBe(true);(0,_vitest.expect)((0,_modifiers.hasModifier)("hover:text-red-500")).toBe(true);(0,_vitest.expect)((0,_modifiers.hasModifier)("focus:border-green-500")).toBe(true);(0,_vitest.expect)((0,_modifiers.hasModifier)("disabled:bg-gray-400")).toBe(true);});(0,_vitest.it)("should return false for classes without modifiers",function(){(0,_vitest.expect)((0,_modifiers.hasModifier)("bg-blue-500")).toBe(false);(0,_vitest.expect)((0,_modifiers.hasModifier)("text-red-500")).toBe(false);(0,_vitest.expect)((0,_modifiers.hasModifier)("p-4")).toBe(false);});(0,_vitest.it)("should return false for unsupported modifiers",function(){(0,_vitest.expect)((0,_modifiers.hasModifier)("selected:bg-gray-500")).toBe(false);(0,_vitest.expect)((0,_modifiers.hasModifier)("pressed:bg-blue-500")).toBe(false);});(0,_vitest.it)("should return false for nested modifiers",function(){(0,_vitest.expect)((0,_modifiers.hasModifier)("active:hover:bg-blue-500")).toBe(false);});(0,_vitest.it)("should return false for empty base class",function(){(0,_vitest.expect)((0,_modifiers.hasModifier)("active:")).toBe(false);});(0,_vitest.it)("should return false for empty string",function(){(0,_vitest.expect)((0,_modifiers.hasModifier)("")).toBe(false);});});(0,_vitest.describe)("splitModifierClasses - basic functionality",function(){(0,_vitest.it)("should split classes with and without modifiers",function(){var result=(0,_modifiers.splitModifierClasses)("bg-blue-500 active:bg-blue-700");(0,_vitest.expect)(result).toEqual({baseClasses:["bg-blue-500"],modifierClasses:[{modifier:"active",baseClass:"bg-blue-700"}]});});(0,_vitest.it)("should handle multiple base classes",function(){var result=(0,_modifiers.splitModifierClasses)("bg-blue-500 p-4 m-2 text-white");(0,_vitest.expect)(result).toEqual({baseClasses:["bg-blue-500","p-4","m-2","text-white"],modifierClasses:[]});});(0,_vitest.it)("should handle multiple modifier classes",function(){var result=(0,_modifiers.splitModifierClasses)("active:bg-blue-700 hover:bg-blue-800 focus:bg-blue-900");(0,_vitest.expect)(result).toEqual({baseClasses:[],modifierClasses:[{modifier:"active",baseClass:"bg-blue-700"},{modifier:"hover",baseClass:"bg-blue-800"},{modifier:"focus",baseClass:"bg-blue-900"}]});});(0,_vitest.it)("should handle mixed base and modifier classes",function(){var result=(0,_modifiers.splitModifierClasses)("bg-blue-500 active:bg-blue-700 p-4 active:p-6");(0,_vitest.expect)(result).toEqual({baseClasses:["bg-blue-500","p-4"],modifierClasses:[{modifier:"active",baseClass:"bg-blue-700"},{modifier:"active",baseClass:"p-6"}]});});});(0,_vitest.describe)("splitModifierClasses - whitespace handling",function(){(0,_vitest.it)("should handle leading whitespace",function(){var result=(0,_modifiers.splitModifierClasses)(" bg-blue-500 active:bg-blue-700");(0,_vitest.expect)(result).toEqual({baseClasses:["bg-blue-500"],modifierClasses:[{modifier:"active",baseClass:"bg-blue-700"}]});});(0,_vitest.it)("should handle trailing whitespace",function(){var result=(0,_modifiers.splitModifierClasses)("bg-blue-500 active:bg-blue-700 ");(0,_vitest.expect)(result).toEqual({baseClasses:["bg-blue-500"],modifierClasses:[{modifier:"active",baseClass:"bg-blue-700"}]});});(0,_vitest.it)("should handle multiple spaces between classes",function(){var result=(0,_modifiers.splitModifierClasses)("bg-blue-500 active:bg-blue-700");(0,_vitest.expect)(result).toEqual({baseClasses:["bg-blue-500"],modifierClasses:[{modifier:"active",baseClass:"bg-blue-700"}]});});(0,_vitest.it)("should handle tabs and newlines",function(){var result=(0,_modifiers.splitModifierClasses)("bg-blue-500\tactive:bg-blue-700\np-4");(0,_vitest.expect)(result).toEqual({baseClasses:["bg-blue-500","p-4"],modifierClasses:[{modifier:"active",baseClass:"bg-blue-700"}]});});(0,_vitest.it)("should handle empty string",function(){var result=(0,_modifiers.splitModifierClasses)("");(0,_vitest.expect)(result).toEqual({baseClasses:[],modifierClasses:[]});});(0,_vitest.it)("should handle whitespace-only string",function(){var result=(0,_modifiers.splitModifierClasses)(" ");(0,_vitest.expect)(result).toEqual({baseClasses:[],modifierClasses:[]});});});(0,_vitest.describe)("splitModifierClasses - complex scenarios",function(){(0,_vitest.it)("should handle duplicate modifiers for same property",function(){var result=(0,_modifiers.splitModifierClasses)("active:bg-blue-700 active:bg-red-700");(0,_vitest.expect)(result).toEqual({baseClasses:[],modifierClasses:[{modifier:"active",baseClass:"bg-blue-700"},{modifier:"active",baseClass:"bg-red-700"}]});});(0,_vitest.it)("should handle all four modifier types",function(){var result=(0,_modifiers.splitModifierClasses)("bg-gray-500 active:bg-blue-700 hover:bg-green-700 focus:bg-red-700 disabled:bg-gray-400");(0,_vitest.expect)(result).toEqual({baseClasses:["bg-gray-500"],modifierClasses:[{modifier:"active",baseClass:"bg-blue-700"},{modifier:"hover",baseClass:"bg-green-700"},{modifier:"focus",baseClass:"bg-red-700"},{modifier:"disabled",baseClass:"bg-gray-400"}]});});(0,_vitest.it)("should ignore unsupported modifiers in the base classes",function(){var result=(0,_modifiers.splitModifierClasses)("bg-blue-500 pressed:bg-gray-500 active:bg-blue-700");(0,_vitest.expect)(result).toEqual({baseClasses:["bg-blue-500","pressed:bg-gray-500"],modifierClasses:[{modifier:"active",baseClass:"bg-blue-700"}]});});(0,_vitest.it)("should handle modifiers with arbitrary values",function(){var result=(0,_modifiers.splitModifierClasses)("bg-blue-500 active:bg-[#ff0000] hover:w-[200px]");(0,_vitest.expect)(result).toEqual({baseClasses:["bg-blue-500"],modifierClasses:[{modifier:"active",baseClass:"bg-[#ff0000]"},{modifier:"hover",baseClass:"w-[200px]"}]});});(0,_vitest.it)("should handle real-world className example",function(){var result=(0,_modifiers.splitModifierClasses)("flex items-center justify-center bg-blue-500 p-4 active:bg-blue-700 active:scale-95 hover:bg-blue-600");(0,_vitest.expect)(result).toEqual({baseClasses:["flex","items-center","justify-center","bg-blue-500","p-4"],modifierClasses:[{modifier:"active",baseClass:"bg-blue-700"},{modifier:"active",baseClass:"scale-95"},{modifier:"hover",baseClass:"bg-blue-600"}]});});});(0,_vitest.describe)("splitModifierClasses - nested modifiers",function(){(0,_vitest.it)("should ignore nested modifiers",function(){var result=(0,_modifiers.splitModifierClasses)("bg-blue-500 active:hover:bg-red-500");(0,_vitest.expect)(result).toEqual({baseClasses:["bg-blue-500","active:hover:bg-red-500"],modifierClasses:[]});});});(0,_vitest.describe)("type safety",function(){(0,_vitest.it)("should properly type modifier types",function(){var result=(0,_modifiers.parseModifier)("active:bg-blue-500");if(result){var modifier=result.modifier;(0,_vitest.expect)(["active","hover","focus","disabled"]).toContain(modifier);}});(0,_vitest.it)("should properly type ParsedModifier",function(){var result=(0,_modifiers.parseModifier)("hover:text-red-500");if(result){var parsed=result;(0,_vitest.expect)(parsed).toHaveProperty("modifier");(0,_vitest.expect)(parsed).toHaveProperty("baseClass");(0,_vitest.expect)(typeof parsed.modifier).toBe("string");(0,_vitest.expect)(typeof parsed.baseClass).toBe("string");}});});
1
+ var _vitest=require("vitest");var _modifiers=require("./modifiers");(0,_vitest.describe)("parseModifier - basic functionality",function(){(0,_vitest.it)("should parse active modifier",function(){var result=(0,_modifiers.parseModifier)("active:bg-blue-500");(0,_vitest.expect)(result).toEqual({modifier:"active",baseClass:"bg-blue-500"});});(0,_vitest.it)("should parse hover modifier",function(){var result=(0,_modifiers.parseModifier)("hover:text-red-500");(0,_vitest.expect)(result).toEqual({modifier:"hover",baseClass:"text-red-500"});});(0,_vitest.it)("should parse focus modifier",function(){var result=(0,_modifiers.parseModifier)("focus:border-green-500");(0,_vitest.expect)(result).toEqual({modifier:"focus",baseClass:"border-green-500"});});(0,_vitest.it)("should parse disabled modifier",function(){var result=(0,_modifiers.parseModifier)("disabled:bg-gray-400");(0,_vitest.expect)(result).toEqual({modifier:"disabled",baseClass:"bg-gray-400"});});(0,_vitest.it)("should return null for class without modifier",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)("bg-blue-500")).toBeNull();(0,_vitest.expect)((0,_modifiers.parseModifier)("text-red-500")).toBeNull();(0,_vitest.expect)((0,_modifiers.parseModifier)("p-4")).toBeNull();});});(0,_vitest.describe)("parseModifier - various base classes",function(){(0,_vitest.it)("should parse modifiers with spacing classes",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)("active:m-4")).toEqual({modifier:"active",baseClass:"m-4"});(0,_vitest.expect)((0,_modifiers.parseModifier)("hover:p-8")).toEqual({modifier:"hover",baseClass:"p-8"});});(0,_vitest.it)("should parse modifiers with layout classes",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)("active:flex")).toEqual({modifier:"active",baseClass:"flex"});(0,_vitest.expect)((0,_modifiers.parseModifier)("focus:absolute")).toEqual({modifier:"focus",baseClass:"absolute"});});(0,_vitest.it)("should parse modifiers with typography classes",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)("hover:text-lg")).toEqual({modifier:"hover",baseClass:"text-lg"});(0,_vitest.expect)((0,_modifiers.parseModifier)("active:font-bold")).toEqual({modifier:"active",baseClass:"font-bold"});});(0,_vitest.it)("should parse modifiers with arbitrary values",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)("active:bg-[#ff0000]")).toEqual({modifier:"active",baseClass:"bg-[#ff0000]"});(0,_vitest.expect)((0,_modifiers.parseModifier)("hover:w-[100px]")).toEqual({modifier:"hover",baseClass:"w-[100px]"});});(0,_vitest.it)("should parse modifiers with complex class names",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)("active:inset-x-4")).toEqual({modifier:"active",baseClass:"inset-x-4"});(0,_vitest.expect)((0,_modifiers.parseModifier)("focus:border-blue-500")).toEqual({modifier:"focus",baseClass:"border-blue-500"});});});(0,_vitest.describe)("parseModifier - edge cases",function(){(0,_vitest.it)("should return null for unsupported modifiers",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)("selected:bg-blue-500")).toBeNull();(0,_vitest.expect)((0,_modifiers.parseModifier)("pressed:bg-red-500")).toBeNull();(0,_vitest.expect)((0,_modifiers.parseModifier)("custom:bg-green-500")).toBeNull();(0,_vitest.expect)((0,_modifiers.parseModifier)("unknown:bg-gray-500")).toBeNull();});(0,_vitest.it)("should return null for nested modifiers",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)("active:hover:bg-blue-500")).toBeNull();(0,_vitest.expect)((0,_modifiers.parseModifier)("hover:focus:text-red-500")).toBeNull();(0,_vitest.expect)((0,_modifiers.parseModifier)("focus:active:p-4")).toBeNull();});(0,_vitest.it)("should return null for empty base class",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)("active:")).toBeNull();(0,_vitest.expect)((0,_modifiers.parseModifier)("hover:")).toBeNull();(0,_vitest.expect)((0,_modifiers.parseModifier)("focus:")).toBeNull();});(0,_vitest.it)("should return null for empty modifier",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)(":bg-blue-500")).toBeNull();(0,_vitest.expect)((0,_modifiers.parseModifier)(":")).toBeNull();});(0,_vitest.it)("should return null for class with only colon",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)(":")).toBeNull();});(0,_vitest.it)("should return null for class with multiple colons but no modifier",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)("bg:blue:500")).toBeNull();});(0,_vitest.it)("should handle base classes that look like they have colons",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)("active:some:thing")).toBeNull();});(0,_vitest.it)("should return null for empty string",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)("")).toBeNull();});});(0,_vitest.describe)("parseModifier - case sensitivity",function(){(0,_vitest.it)("should be case-sensitive for modifiers",function(){(0,_vitest.expect)((0,_modifiers.parseModifier)("Active:bg-blue-500")).toBeNull();(0,_vitest.expect)((0,_modifiers.parseModifier)("ACTIVE:bg-blue-500")).toBeNull();(0,_vitest.expect)((0,_modifiers.parseModifier)("Hover:text-red-500")).toBeNull();(0,_vitest.expect)((0,_modifiers.parseModifier)("FOCUS:border-green-500")).toBeNull();});(0,_vitest.it)("should preserve case in base class",function(){var result=(0,_modifiers.parseModifier)("active:bg-Blue-500");(0,_vitest.expect)(result).toEqual({modifier:"active",baseClass:"bg-Blue-500"});});});(0,_vitest.describe)("hasModifier",function(){(0,_vitest.it)("should return true for classes with modifiers",function(){(0,_vitest.expect)((0,_modifiers.hasModifier)("active:bg-blue-500")).toBe(true);(0,_vitest.expect)((0,_modifiers.hasModifier)("hover:text-red-500")).toBe(true);(0,_vitest.expect)((0,_modifiers.hasModifier)("focus:border-green-500")).toBe(true);(0,_vitest.expect)((0,_modifiers.hasModifier)("disabled:bg-gray-400")).toBe(true);});(0,_vitest.it)("should return false for classes without modifiers",function(){(0,_vitest.expect)((0,_modifiers.hasModifier)("bg-blue-500")).toBe(false);(0,_vitest.expect)((0,_modifiers.hasModifier)("text-red-500")).toBe(false);(0,_vitest.expect)((0,_modifiers.hasModifier)("p-4")).toBe(false);});(0,_vitest.it)("should return false for unsupported modifiers",function(){(0,_vitest.expect)((0,_modifiers.hasModifier)("selected:bg-gray-500")).toBe(false);(0,_vitest.expect)((0,_modifiers.hasModifier)("pressed:bg-blue-500")).toBe(false);});(0,_vitest.it)("should return false for nested modifiers",function(){(0,_vitest.expect)((0,_modifiers.hasModifier)("active:hover:bg-blue-500")).toBe(false);});(0,_vitest.it)("should return false for empty base class",function(){(0,_vitest.expect)((0,_modifiers.hasModifier)("active:")).toBe(false);});(0,_vitest.it)("should return false for empty string",function(){(0,_vitest.expect)((0,_modifiers.hasModifier)("")).toBe(false);});});(0,_vitest.describe)("splitModifierClasses - basic functionality",function(){(0,_vitest.it)("should split classes with and without modifiers",function(){var result=(0,_modifiers.splitModifierClasses)("bg-blue-500 active:bg-blue-700");(0,_vitest.expect)(result).toEqual({baseClasses:["bg-blue-500"],modifierClasses:[{modifier:"active",baseClass:"bg-blue-700"}]});});(0,_vitest.it)("should handle multiple base classes",function(){var result=(0,_modifiers.splitModifierClasses)("bg-blue-500 p-4 m-2 text-white");(0,_vitest.expect)(result).toEqual({baseClasses:["bg-blue-500","p-4","m-2","text-white"],modifierClasses:[]});});(0,_vitest.it)("should handle multiple modifier classes",function(){var result=(0,_modifiers.splitModifierClasses)("active:bg-blue-700 hover:bg-blue-800 focus:bg-blue-900");(0,_vitest.expect)(result).toEqual({baseClasses:[],modifierClasses:[{modifier:"active",baseClass:"bg-blue-700"},{modifier:"hover",baseClass:"bg-blue-800"},{modifier:"focus",baseClass:"bg-blue-900"}]});});(0,_vitest.it)("should handle mixed base and modifier classes",function(){var result=(0,_modifiers.splitModifierClasses)("bg-blue-500 active:bg-blue-700 p-4 active:p-6");(0,_vitest.expect)(result).toEqual({baseClasses:["bg-blue-500","p-4"],modifierClasses:[{modifier:"active",baseClass:"bg-blue-700"},{modifier:"active",baseClass:"p-6"}]});});});(0,_vitest.describe)("splitModifierClasses - whitespace handling",function(){(0,_vitest.it)("should handle leading whitespace",function(){var result=(0,_modifiers.splitModifierClasses)(" bg-blue-500 active:bg-blue-700");(0,_vitest.expect)(result).toEqual({baseClasses:["bg-blue-500"],modifierClasses:[{modifier:"active",baseClass:"bg-blue-700"}]});});(0,_vitest.it)("should handle trailing whitespace",function(){var result=(0,_modifiers.splitModifierClasses)("bg-blue-500 active:bg-blue-700 ");(0,_vitest.expect)(result).toEqual({baseClasses:["bg-blue-500"],modifierClasses:[{modifier:"active",baseClass:"bg-blue-700"}]});});(0,_vitest.it)("should handle multiple spaces between classes",function(){var result=(0,_modifiers.splitModifierClasses)("bg-blue-500 active:bg-blue-700");(0,_vitest.expect)(result).toEqual({baseClasses:["bg-blue-500"],modifierClasses:[{modifier:"active",baseClass:"bg-blue-700"}]});});(0,_vitest.it)("should handle tabs and newlines",function(){var result=(0,_modifiers.splitModifierClasses)("bg-blue-500\tactive:bg-blue-700\np-4");(0,_vitest.expect)(result).toEqual({baseClasses:["bg-blue-500","p-4"],modifierClasses:[{modifier:"active",baseClass:"bg-blue-700"}]});});(0,_vitest.it)("should handle empty string",function(){var result=(0,_modifiers.splitModifierClasses)("");(0,_vitest.expect)(result).toEqual({baseClasses:[],modifierClasses:[]});});(0,_vitest.it)("should handle whitespace-only string",function(){var result=(0,_modifiers.splitModifierClasses)(" ");(0,_vitest.expect)(result).toEqual({baseClasses:[],modifierClasses:[]});});});(0,_vitest.describe)("splitModifierClasses - complex scenarios",function(){(0,_vitest.it)("should handle duplicate modifiers for same property",function(){var result=(0,_modifiers.splitModifierClasses)("active:bg-blue-700 active:bg-red-700");(0,_vitest.expect)(result).toEqual({baseClasses:[],modifierClasses:[{modifier:"active",baseClass:"bg-blue-700"},{modifier:"active",baseClass:"bg-red-700"}]});});(0,_vitest.it)("should handle all four modifier types",function(){var result=(0,_modifiers.splitModifierClasses)("bg-gray-500 active:bg-blue-700 hover:bg-green-700 focus:bg-red-700 disabled:bg-gray-400");(0,_vitest.expect)(result).toEqual({baseClasses:["bg-gray-500"],modifierClasses:[{modifier:"active",baseClass:"bg-blue-700"},{modifier:"hover",baseClass:"bg-green-700"},{modifier:"focus",baseClass:"bg-red-700"},{modifier:"disabled",baseClass:"bg-gray-400"}]});});(0,_vitest.it)("should ignore unsupported modifiers in the base classes",function(){var result=(0,_modifiers.splitModifierClasses)("bg-blue-500 pressed:bg-gray-500 active:bg-blue-700");(0,_vitest.expect)(result).toEqual({baseClasses:["bg-blue-500","pressed:bg-gray-500"],modifierClasses:[{modifier:"active",baseClass:"bg-blue-700"}]});});(0,_vitest.it)("should handle modifiers with arbitrary values",function(){var result=(0,_modifiers.splitModifierClasses)("bg-blue-500 active:bg-[#ff0000] hover:w-[200px]");(0,_vitest.expect)(result).toEqual({baseClasses:["bg-blue-500"],modifierClasses:[{modifier:"active",baseClass:"bg-[#ff0000]"},{modifier:"hover",baseClass:"w-[200px]"}]});});(0,_vitest.it)("should handle real-world className example",function(){var result=(0,_modifiers.splitModifierClasses)("flex items-center justify-center bg-blue-500 p-4 active:bg-blue-700 active:scale-95 hover:bg-blue-600");(0,_vitest.expect)(result).toEqual({baseClasses:["flex","items-center","justify-center","bg-blue-500","p-4"],modifierClasses:[{modifier:"active",baseClass:"bg-blue-700"},{modifier:"active",baseClass:"scale-95"},{modifier:"hover",baseClass:"bg-blue-600"}]});});});(0,_vitest.describe)("splitModifierClasses - nested modifiers",function(){(0,_vitest.it)("should ignore nested modifiers",function(){var result=(0,_modifiers.splitModifierClasses)("bg-blue-500 active:hover:bg-red-500");(0,_vitest.expect)(result).toEqual({baseClasses:["bg-blue-500","active:hover:bg-red-500"],modifierClasses:[]});});});(0,_vitest.describe)("type safety",function(){(0,_vitest.it)("should properly type modifier types",function(){var result=(0,_modifiers.parseModifier)("active:bg-blue-500");if(result){var modifier=result.modifier;(0,_vitest.expect)(["active","hover","focus","disabled"]).toContain(modifier);}});(0,_vitest.it)("should properly type ParsedModifier",function(){var result=(0,_modifiers.parseModifier)("hover:text-red-500");if(result){var parsed=result;(0,_vitest.expect)(parsed).toHaveProperty("modifier");(0,_vitest.expect)(parsed).toHaveProperty("baseClass");(0,_vitest.expect)(typeof parsed.modifier).toBe("string");(0,_vitest.expect)(typeof parsed.baseClass).toBe("string");}});});(0,_vitest.describe)("isSchemeModifier",function(){(0,_vitest.it)("should return true for scheme modifier",function(){(0,_vitest.expect)((0,_modifiers.isSchemeModifier)("scheme")).toBe(true);});(0,_vitest.it)("should return false for non-scheme modifiers",function(){(0,_vitest.expect)((0,_modifiers.isSchemeModifier)("dark")).toBe(false);(0,_vitest.expect)((0,_modifiers.isSchemeModifier)("light")).toBe(false);(0,_vitest.expect)((0,_modifiers.isSchemeModifier)("active")).toBe(false);(0,_vitest.expect)((0,_modifiers.isSchemeModifier)("ios")).toBe(false);});});(0,_vitest.describe)("isColorClass",function(){(0,_vitest.it)("should return true for text color classes",function(){(0,_vitest.expect)((0,_modifiers.isColorClass)("text-red-500")).toBe(true);(0,_vitest.expect)((0,_modifiers.isColorClass)("text-systemGray")).toBe(true);(0,_vitest.expect)((0,_modifiers.isColorClass)("text-blue-50")).toBe(true);});(0,_vitest.it)("should return true for background color classes",function(){(0,_vitest.expect)((0,_modifiers.isColorClass)("bg-red-500")).toBe(true);(0,_vitest.expect)((0,_modifiers.isColorClass)("bg-systemGray")).toBe(true);(0,_vitest.expect)((0,_modifiers.isColorClass)("bg-transparent")).toBe(true);});(0,_vitest.it)("should return true for border color classes",function(){(0,_vitest.expect)((0,_modifiers.isColorClass)("border-red-500")).toBe(true);(0,_vitest.expect)((0,_modifiers.isColorClass)("border-systemGray")).toBe(true);(0,_vitest.expect)((0,_modifiers.isColorClass)("border-black")).toBe(true);});(0,_vitest.it)("should return false for non-color classes",function(){(0,_vitest.expect)((0,_modifiers.isColorClass)("m-4")).toBe(false);(0,_vitest.expect)((0,_modifiers.isColorClass)("p-2")).toBe(false);(0,_vitest.expect)((0,_modifiers.isColorClass)("flex")).toBe(false);(0,_vitest.expect)((0,_modifiers.isColorClass)("rounded-lg")).toBe(false);(0,_vitest.expect)((0,_modifiers.isColorClass)("font-bold")).toBe(false);});});(0,_vitest.describe)("expandSchemeModifier",function(){var customColors={"systemGray-dark":"#333333","systemGray-light":"#CCCCCC","primary-dark":"#1E40AF","primary-light":"#BFDBFE","accent-dark":"#DC2626","accent-light":"#FECACA"};(0,_vitest.it)("should expand text color scheme modifier with default suffixes",function(){var modifier={modifier:"scheme",baseClass:"text-systemGray"};var result=(0,_modifiers.expandSchemeModifier)(modifier,customColors);(0,_vitest.expect)(result).toHaveLength(2);(0,_vitest.expect)(result[0]).toEqual({modifier:"dark",baseClass:"text-systemGray-dark"});(0,_vitest.expect)(result[1]).toEqual({modifier:"light",baseClass:"text-systemGray-light"});});(0,_vitest.it)("should expand background color scheme modifier",function(){var modifier={modifier:"scheme",baseClass:"bg-primary"};var result=(0,_modifiers.expandSchemeModifier)(modifier,customColors);(0,_vitest.expect)(result).toHaveLength(2);(0,_vitest.expect)(result[0]).toEqual({modifier:"dark",baseClass:"bg-primary-dark"});(0,_vitest.expect)(result[1]).toEqual({modifier:"light",baseClass:"bg-primary-light"});});(0,_vitest.it)("should expand border color scheme modifier",function(){var modifier={modifier:"scheme",baseClass:"border-accent"};var result=(0,_modifiers.expandSchemeModifier)(modifier,customColors);(0,_vitest.expect)(result).toHaveLength(2);(0,_vitest.expect)(result[0]).toEqual({modifier:"dark",baseClass:"border-accent-dark"});(0,_vitest.expect)(result[1]).toEqual({modifier:"light",baseClass:"border-accent-light"});});(0,_vitest.it)("should use custom suffixes when provided",function(){var modifier={modifier:"scheme",baseClass:"text-systemGray"};var _result=(0,_modifiers.expandSchemeModifier)(modifier,customColors,"-darkMode","-lightMode");var expectedColors={"systemGray-darkMode":"#333333","systemGray-lightMode":"#CCCCCC"};(0,_vitest.expect)((0,_modifiers.expandSchemeModifier)(modifier,expectedColors,"-darkMode","-lightMode")).toHaveLength(2);});(0,_vitest.it)("should return empty array for non-color classes",function(){var modifier={modifier:"scheme",baseClass:"m-4"};var result=(0,_modifiers.expandSchemeModifier)(modifier,customColors);(0,_vitest.expect)(result).toEqual([]);});(0,_vitest.it)("should return empty array when dark color variant is missing",function(){var modifier={modifier:"scheme",baseClass:"text-missing"};var incompleteColors={"missing-light":"#FFFFFF"};var result=(0,_modifiers.expandSchemeModifier)(modifier,incompleteColors);(0,_vitest.expect)(result).toEqual([]);});(0,_vitest.it)("should return empty array when light color variant is missing",function(){var modifier={modifier:"scheme",baseClass:"text-missing"};var incompleteColors={"missing-dark":"#000000"};var result=(0,_modifiers.expandSchemeModifier)(modifier,incompleteColors);(0,_vitest.expect)(result).toEqual([]);});(0,_vitest.it)("should return empty array when both color variants are missing",function(){var modifier={modifier:"scheme",baseClass:"text-missing"};var result=(0,_modifiers.expandSchemeModifier)(modifier,customColors);(0,_vitest.expect)(result).toEqual([]);});});
@@ -7,5 +7,7 @@ export declare const LETTER_SPACING_SCALE: Record<string, number>;
7
7
  export declare const LINE_HEIGHT_SCALE: Record<string, number>;
8
8
  /**
9
9
  * Parse typography classes
10
+ * @param cls - Class name to parse
11
+ * @param customFontFamily - Optional custom fontFamily from tailwind.config
10
12
  */
11
- export declare function parseTypography(cls: string): StyleObject | null;
13
+ export declare function parseTypography(cls: string, customFontFamily?: Record<string, string>): StyleObject | null;
@@ -1 +1 @@
1
- Object.defineProperty(exports,"__esModule",{value:true});exports.LINE_HEIGHT_SCALE=exports.LETTER_SPACING_SCALE=exports.FONT_SIZES=void 0;exports.parseTypography=parseTypography;var FONT_SIZES=exports.FONT_SIZES={xs:12,sm:14,base:16,lg:18,xl:20,"2xl":24,"3xl":30,"4xl":36,"5xl":48,"6xl":60,"7xl":72,"8xl":96,"9xl":128};var LETTER_SPACING_SCALE=exports.LETTER_SPACING_SCALE={tighter:-0.8,tight:-0.4,normal:0,wide:0.4,wider:0.8,widest:1.6};var FONT_FAMILY_MAP={"font-sans":{fontFamily:"System"},"font-serif":{fontFamily:"serif"},"font-mono":{fontFamily:"Courier"}};var FONT_WEIGHT_MAP={"font-thin":{fontWeight:"100"},"font-extralight":{fontWeight:"200"},"font-light":{fontWeight:"300"},"font-normal":{fontWeight:"400"},"font-medium":{fontWeight:"500"},"font-semibold":{fontWeight:"600"},"font-bold":{fontWeight:"700"},"font-extrabold":{fontWeight:"800"},"font-black":{fontWeight:"900"}};var FONT_STYLE_MAP={italic:{fontStyle:"italic"},"not-italic":{fontStyle:"normal"}};var TEXT_ALIGN_MAP={"text-left":{textAlign:"left"},"text-center":{textAlign:"center"},"text-right":{textAlign:"right"},"text-justify":{textAlign:"justify"}};var TEXT_DECORATION_MAP={underline:{textDecorationLine:"underline"},"line-through":{textDecorationLine:"line-through"},"no-underline":{textDecorationLine:"none"}};var TEXT_TRANSFORM_MAP={uppercase:{textTransform:"uppercase"},lowercase:{textTransform:"lowercase"},capitalize:{textTransform:"capitalize"},"normal-case":{textTransform:"none"}};var LINE_HEIGHT_SCALE=exports.LINE_HEIGHT_SCALE={3:12,4:16,5:20,6:24,7:28,8:32,9:36,10:40};var LINE_HEIGHT_MAP={"leading-none":{lineHeight:16},"leading-tight":{lineHeight:20},"leading-snug":{lineHeight:22},"leading-normal":{lineHeight:24},"leading-relaxed":{lineHeight:28},"leading-loose":{lineHeight:32}};var TRACKING_MAP={"tracking-tighter":{letterSpacing:-0.8},"tracking-tight":{letterSpacing:-0.4},"tracking-normal":{letterSpacing:0},"tracking-wide":{letterSpacing:0.4},"tracking-wider":{letterSpacing:0.8},"tracking-widest":{letterSpacing:1.6}};function parseArbitraryFontSize(value){var pxMatch=value.match(/^\[(\d+)(?:px)?\]$/);if(pxMatch){return parseInt(pxMatch[1],10);}if(value.startsWith("[")&&value.endsWith("]")){if(process.env.NODE_ENV!=="production"){console.warn(`[react-native-tailwind] Unsupported arbitrary font size value: ${value}. Only px values are supported (e.g., [18px] or [18]).`);}return null;}return null;}function parseArbitraryLineHeight(value){var pxMatch=value.match(/^\[(\d+)(?:px)?\]$/);if(pxMatch){return parseInt(pxMatch[1],10);}if(value.startsWith("[")&&value.endsWith("]")){if(process.env.NODE_ENV!=="production"){console.warn(`[react-native-tailwind] Unsupported arbitrary line height value: ${value}. Only px values are supported (e.g., [24px] or [24]).`);}return null;}return null;}function parseTypography(cls){var _ref,_ref2,_ref3,_ref4,_ref5,_ref6,_ref7,_FONT_FAMILY_MAP$cls;if(cls.startsWith("text-")){var sizeKey=cls.substring(5);var arbitraryValue=parseArbitraryFontSize(sizeKey);if(arbitraryValue!==null){return{fontSize:arbitraryValue};}var fontSize=FONT_SIZES[sizeKey];if(fontSize!==undefined){return{fontSize:fontSize};}}if(cls.startsWith("leading-")){var heightKey=cls.substring(8);var _arbitraryValue=parseArbitraryLineHeight(heightKey);if(_arbitraryValue!==null){return{lineHeight:_arbitraryValue};}var lineHeight=LINE_HEIGHT_SCALE[heightKey];if(lineHeight!==undefined){return{lineHeight:lineHeight};}}return(_ref=(_ref2=(_ref3=(_ref4=(_ref5=(_ref6=(_ref7=(_FONT_FAMILY_MAP$cls=FONT_FAMILY_MAP[cls])!=null?_FONT_FAMILY_MAP$cls:FONT_WEIGHT_MAP[cls])!=null?_ref7:FONT_STYLE_MAP[cls])!=null?_ref6:TEXT_ALIGN_MAP[cls])!=null?_ref5:TEXT_DECORATION_MAP[cls])!=null?_ref4:TEXT_TRANSFORM_MAP[cls])!=null?_ref3:LINE_HEIGHT_MAP[cls])!=null?_ref2:TRACKING_MAP[cls])!=null?_ref:null;}
1
+ var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.LINE_HEIGHT_SCALE=exports.LETTER_SPACING_SCALE=exports.FONT_SIZES=void 0;exports.parseTypography=parseTypography;var _slicedToArray2=_interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));var FONT_SIZES=exports.FONT_SIZES={xs:12,sm:14,base:16,lg:18,xl:20,"2xl":24,"3xl":30,"4xl":36,"5xl":48,"6xl":60,"7xl":72,"8xl":96,"9xl":128};var LETTER_SPACING_SCALE=exports.LETTER_SPACING_SCALE={tighter:-0.8,tight:-0.4,normal:0,wide:0.4,wider:0.8,widest:1.6};var FONT_FAMILY_MAP={"font-sans":{fontFamily:"System"},"font-serif":{fontFamily:"serif"},"font-mono":{fontFamily:"Courier"}};var FONT_WEIGHT_MAP={"font-thin":{fontWeight:"100"},"font-extralight":{fontWeight:"200"},"font-light":{fontWeight:"300"},"font-normal":{fontWeight:"400"},"font-medium":{fontWeight:"500"},"font-semibold":{fontWeight:"600"},"font-bold":{fontWeight:"700"},"font-extrabold":{fontWeight:"800"},"font-black":{fontWeight:"900"}};var FONT_STYLE_MAP={italic:{fontStyle:"italic"},"not-italic":{fontStyle:"normal"}};var TEXT_ALIGN_MAP={"text-left":{textAlign:"left"},"text-center":{textAlign:"center"},"text-right":{textAlign:"right"},"text-justify":{textAlign:"justify"}};var TEXT_DECORATION_MAP={underline:{textDecorationLine:"underline"},"line-through":{textDecorationLine:"line-through"},"no-underline":{textDecorationLine:"none"}};var TEXT_TRANSFORM_MAP={uppercase:{textTransform:"uppercase"},lowercase:{textTransform:"lowercase"},capitalize:{textTransform:"capitalize"},"normal-case":{textTransform:"none"}};var LINE_HEIGHT_SCALE=exports.LINE_HEIGHT_SCALE={3:12,4:16,5:20,6:24,7:28,8:32,9:36,10:40};var LINE_HEIGHT_MAP={"leading-none":{lineHeight:16},"leading-tight":{lineHeight:20},"leading-snug":{lineHeight:22},"leading-normal":{lineHeight:24},"leading-relaxed":{lineHeight:28},"leading-loose":{lineHeight:32}};var TRACKING_MAP={"tracking-tighter":{letterSpacing:-0.8},"tracking-tight":{letterSpacing:-0.4},"tracking-normal":{letterSpacing:0},"tracking-wide":{letterSpacing:0.4},"tracking-wider":{letterSpacing:0.8},"tracking-widest":{letterSpacing:1.6}};function parseArbitraryFontSize(value){var pxMatch=value.match(/^\[(\d+)(?:px)?\]$/);if(pxMatch){return parseInt(pxMatch[1],10);}if(value.startsWith("[")&&value.endsWith("]")){if(process.env.NODE_ENV!=="production"){console.warn(`[react-native-tailwind] Unsupported arbitrary font size value: ${value}. Only px values are supported (e.g., [18px] or [18]).`);}return null;}return null;}function parseArbitraryLineHeight(value){var pxMatch=value.match(/^\[(\d+)(?:px)?\]$/);if(pxMatch){return parseInt(pxMatch[1],10);}if(value.startsWith("[")&&value.endsWith("]")){if(process.env.NODE_ENV!=="production"){console.warn(`[react-native-tailwind] Unsupported arbitrary line height value: ${value}. Only px values are supported (e.g., [24px] or [24]).`);}return null;}return null;}function parseTypography(cls,customFontFamily){var _ref3,_ref4,_ref5,_ref6,_ref7,_ref8,_ref9,_fontFamilyMap$cls;var fontFamilyMap=customFontFamily?Object.assign({},FONT_FAMILY_MAP,Object.fromEntries(Object.entries(customFontFamily).map(function(_ref){var _ref2=(0,_slicedToArray2.default)(_ref,2),key=_ref2[0],value=_ref2[1];return[`font-${key}`,{fontFamily:value}];}))):FONT_FAMILY_MAP;if(cls.startsWith("text-")){var sizeKey=cls.substring(5);var arbitraryValue=parseArbitraryFontSize(sizeKey);if(arbitraryValue!==null){return{fontSize:arbitraryValue};}var fontSize=FONT_SIZES[sizeKey];if(fontSize!==undefined){return{fontSize:fontSize};}}if(cls.startsWith("leading-")){var heightKey=cls.substring(8);var _arbitraryValue=parseArbitraryLineHeight(heightKey);if(_arbitraryValue!==null){return{lineHeight:_arbitraryValue};}var lineHeight=LINE_HEIGHT_SCALE[heightKey];if(lineHeight!==undefined){return{lineHeight:lineHeight};}}return(_ref3=(_ref4=(_ref5=(_ref6=(_ref7=(_ref8=(_ref9=(_fontFamilyMap$cls=fontFamilyMap[cls])!=null?_fontFamilyMap$cls:FONT_WEIGHT_MAP[cls])!=null?_ref9:FONT_STYLE_MAP[cls])!=null?_ref8:TEXT_ALIGN_MAP[cls])!=null?_ref7:TEXT_DECORATION_MAP[cls])!=null?_ref6:TEXT_TRANSFORM_MAP[cls])!=null?_ref5:LINE_HEIGHT_MAP[cls])!=null?_ref4:TRACKING_MAP[cls])!=null?_ref3:null;}