@@ -8,12 +8,14 @@ import type { CustomTheme, ModifierType, ParsedModifier } from "../../parser/ind
88import {
99 expandSchemeModifier ,
1010 isColorSchemeModifier ,
11+ isDirectionalModifier ,
1112 isPlatformModifier ,
1213 isSchemeModifier ,
1314} from "../../parser/index.js" ;
1415import type { SchemeModifierConfig } from "../../types/config.js" ;
1516import type { StyleObject } from "../../types/core.js" ;
1617import { processColorSchemeModifiers } from "./colorSchemeModifierProcessing.js" ;
18+ import { processDirectionalModifiers } from "./directionalModifierProcessing.js" ;
1719import { processPlatformModifiers } from "./platformModifierProcessing.js" ;
1820import { hasRuntimeDimensions } from "./windowDimensionsProcessing.js" ;
1921
@@ -33,6 +35,9 @@ export interface TwProcessingState {
3335 colorSchemeLocalIdentifier ?: string ;
3436 // Platform support (for ios:/android:/web: modifiers)
3537 needsPlatformImport : boolean ;
38+ // Directional support (for rtl:/ltr: modifiers)
39+ needsI18nManagerImport : boolean ;
40+ i18nManagerVariableName : string ;
3641}
3742
3843/**
@@ -102,11 +107,15 @@ export function processTwCall(
102107 objectProperties . push ( t . objectProperty ( t . identifier ( "style" ) , t . objectExpression ( [ ] ) ) ) ;
103108 }
104109
105- // Separate color-scheme and platform modifiers from other modifiers
110+ // Separate color-scheme, platform, and directional modifiers from other modifiers
106111 const colorSchemeModifiers = modifierClasses . filter ( ( m ) => isColorSchemeModifier ( m . modifier ) ) ;
107112 const platformModifiers = modifierClasses . filter ( ( m ) => isPlatformModifier ( m . modifier ) ) ;
113+ const directionalModifiers = modifierClasses . filter ( ( m ) => isDirectionalModifier ( m . modifier ) ) ;
108114 const otherModifiers = modifierClasses . filter (
109- ( m ) => ! isColorSchemeModifier ( m . modifier ) && ! isPlatformModifier ( m . modifier ) ,
115+ ( m ) =>
116+ ! isColorSchemeModifier ( m . modifier ) &&
117+ ! isPlatformModifier ( m . modifier ) &&
118+ ! isDirectionalModifier ( m . modifier ) ,
110119 ) ;
111120
112121 // Check if we need color scheme support
@@ -293,7 +302,87 @@ export function processTwCall(
293302 }
294303 }
295304
296- // Group other modifiers by type (non-color-scheme and non-platform modifiers)
305+ // Process directional modifiers if present
306+ const hasDirectionalModifiers = directionalModifiers . length > 0 ;
307+
308+ if ( hasDirectionalModifiers ) {
309+ // Mark that we need I18nManager import
310+ state . needsI18nManagerImport = true ;
311+
312+ // Generate directional conditional expressions
313+ const directionalConditionals = processDirectionalModifiers (
314+ directionalModifiers ,
315+ state ,
316+ parseClassName ,
317+ generateStyleKey ,
318+ t ,
319+ ) ;
320+
321+ // If we already have a style array (from color scheme or platform modifiers), add to it
322+ // Otherwise, convert style property to an array
323+ const styleProperty = objectProperties . find (
324+ ( prop ) => t . isIdentifier ( prop . key ) && prop . key . name === "style" ,
325+ ) ;
326+
327+ if ( styleProperty && t . isArrayExpression ( styleProperty . value ) ) {
328+ // Already have style array, add directional conditionals to it
329+ styleProperty . value . elements . push ( ...directionalConditionals ) ;
330+ } else {
331+ // No existing array, create style array with base + directional conditionals
332+ const styleArrayElements : BabelTypes . Expression [ ] = [ ] ;
333+
334+ // Add base style if present
335+ if ( baseClasses . length > 0 ) {
336+ const baseClassName = baseClasses . join ( " " ) ;
337+ const baseStyleObject = parseClassName ( baseClassName , state . customTheme ) ;
338+ const baseStyleKey = generateStyleKey ( baseClassName ) ;
339+ state . styleRegistry . set ( baseStyleKey , baseStyleObject ) ;
340+ styleArrayElements . push (
341+ t . memberExpression ( t . identifier ( state . stylesIdentifier ) , t . identifier ( baseStyleKey ) ) ,
342+ ) ;
343+ }
344+
345+ // Add directional conditionals
346+ styleArrayElements . push ( ...directionalConditionals ) ;
347+
348+ // Replace style property with array
349+ objectProperties [ 0 ] = t . objectProperty ( t . identifier ( "style" ) , t . arrayExpression ( styleArrayElements ) ) ;
350+ }
351+
352+ // Also add rtlStyle/ltrStyle properties for manual processing
353+ const rtlModifiers = directionalModifiers . filter ( ( m ) => m . modifier === "rtl" ) ;
354+ const ltrModifiers = directionalModifiers . filter ( ( m ) => m . modifier === "ltr" ) ;
355+
356+ if ( rtlModifiers . length > 0 ) {
357+ const rtlClassNames = rtlModifiers . map ( ( m ) => m . baseClass ) . join ( " " ) ;
358+ const rtlStyleObject = parseClassName ( rtlClassNames , state . customTheme ) ;
359+ const rtlStyleKey = generateStyleKey ( `rtl_${ rtlClassNames } ` ) ;
360+ state . styleRegistry . set ( rtlStyleKey , rtlStyleObject ) ;
361+
362+ objectProperties . push (
363+ t . objectProperty (
364+ t . identifier ( "rtlStyle" ) ,
365+ t . memberExpression ( t . identifier ( state . stylesIdentifier ) , t . identifier ( rtlStyleKey ) ) ,
366+ ) ,
367+ ) ;
368+ }
369+
370+ if ( ltrModifiers . length > 0 ) {
371+ const ltrClassNames = ltrModifiers . map ( ( m ) => m . baseClass ) . join ( " " ) ;
372+ const ltrStyleObject = parseClassName ( ltrClassNames , state . customTheme ) ;
373+ const ltrStyleKey = generateStyleKey ( `ltr_${ ltrClassNames } ` ) ;
374+ state . styleRegistry . set ( ltrStyleKey , ltrStyleObject ) ;
375+
376+ objectProperties . push (
377+ t . objectProperty (
378+ t . identifier ( "ltrStyle" ) ,
379+ t . memberExpression ( t . identifier ( state . stylesIdentifier ) , t . identifier ( ltrStyleKey ) ) ,
380+ ) ,
381+ ) ;
382+ }
383+ }
384+
385+ // Group other modifiers by type (non-color-scheme, non-platform, and non-directional modifiers)
297386 const modifiersByType = new Map < ModifierType , ParsedModifier [ ] > ( ) ;
298387 for ( const mod of otherModifiers ) {
299388 if ( ! modifiersByType . has ( mod . modifier ) ) {
0 commit comments