@@ -470,58 +470,91 @@ function processStylexRules(
470470 ';\n'
471471 : '';
472472
473- const collectedCSS = grouped
473+ const globalMediaQueryGroups = new Map ( ) ;
474+ const globalNonMediaRules = [ ] ;
475+
476+ const perGroupOutput = grouped
474477 . map ( ( group , index ) => {
475478 const pri = group [ 0 ] [ 2 ] ;
476- const collectedCSS = Array . from (
477- new Map ( group . map ( ( [ a , b ] ) => [ a , b ] ) ) . values ( ) ,
478- )
479- . flatMap ( ( rule ) => {
480- const { ltr, rtl } = rule ;
481- let ltrRule = ltr ,
482- rtlRule = rtl ;
483-
484- if ( ! useLayers ) {
485- ltrRule = addSpecificityLevel ( ltrRule , index ) ;
486- rtlRule = rtlRule && addSpecificityLevel ( rtlRule , index ) ;
487- }
479+ const rules = Array . from ( new Map ( group . map ( ( [ a , b ] ) => [ a , b ] ) ) . values ( ) ) ;
480+
481+ const mediaQueryGroups = useLayers ? new Map ( ) : globalMediaQueryGroups ;
482+ const nonMediaRules = useLayers ? [ ] : globalNonMediaRules ;
483+
484+ rules . forEach ( ( rule ) => {
485+ const { ltr, rtl } = rule ;
486+ let ltrRule = ltr ,
487+ rtlRule = rtl ;
488488
489- // check if the selector looks like .xtrlmmh, .xtrlmmh:root
490- // if so, turn it into .xtrlmmh.xtrlmmh, .xtrlmmh.xtrlmmh:root
491- // This is to ensure the themes always have precedence over the
492- // default variable values
493- ltrRule = ltrRule . replace (
489+ if ( ! useLayers ) {
490+ ltrRule = addSpecificityLevel ( ltrRule , index ) ;
491+ rtlRule = rtlRule && addSpecificityLevel ( rtlRule , index ) ;
492+ }
493+
494+ ltrRule = ltrRule . replace (
495+ / \. ( [ a - z A - Z 0 - 9 ] + ) , \. ( [ a - z A - Z 0 - 9 ] + ) : r o o t / g,
496+ '.$1.$1, .$1.$1:root' ,
497+ ) ;
498+ if ( rtlRule ) {
499+ rtlRule = rtlRule . replace (
494500 / \. ( [ a - z A - Z 0 - 9 ] + ) , \. ( [ a - z A - Z 0 - 9 ] + ) : r o o t / g,
495501 '.$1.$1, .$1.$1:root' ,
496502 ) ;
497- if ( rtlRule ) {
498- rtlRule = rtlRule . replace (
499- / \. ( [ a - z A - Z 0 - 9 ] + ) , \. ( [ a - z A - Z 0 - 9 ] + ) : r o o t / g,
500- '.$1.$1, .$1.$1:root' ,
501- ) ;
502- }
503+ }
503504
504- return rtlRule
505- ? enableLTRRTLComments
506- ? [
507- `/* @ltr begin */${ ltrRule } /* @ltr end */` ,
508- `/* @rtl begin */${ rtlRule } /* @rtl end */` ,
509- ]
510- : [
511- addAncestorSelector ( ltrRule , "html:not([dir='rtl'])" ) ,
512- addAncestorSelector ( rtlRule , "html[dir='rtl']" ) ,
513- ]
514- : [ ltrRule ] ;
515- } )
516- . join ( '\n' ) ;
517-
518- // Don't put @property, @keyframe, @position-try in layers
519- return useLayers && pri > 0
520- ? `@layer priority${ index + 1 } {\n${ collectedCSS } \n}`
521- : collectedCSS ;
505+ const processedRules = rtlRule
506+ ? enableLTRRTLComments
507+ ? [
508+ `/* @ltr begin */${ ltrRule } /* @ltr end */` ,
509+ `/* @rtl begin */${ rtlRule } /* @rtl end */` ,
510+ ]
511+ : [
512+ addAncestorSelector ( ltrRule , "html:not([dir='rtl'])" ) ,
513+ addAncestorSelector ( rtlRule , "html[dir='rtl']" ) ,
514+ ]
515+ : [ ltrRule ] ;
516+
517+ processedRules . forEach ( ( processedRule ) => {
518+ const mediaQueryMatch = processedRule . match (
519+ / ^ ( @ m e d i a [ ^ { ] + ) \{ ( [ \s \S ] * ) \} $ / m,
520+ ) ;
521+ if ( mediaQueryMatch ) {
522+ const [ , rawMQ , innerContent ] = mediaQueryMatch ;
523+ const mq = rawMQ . trim ( ) . replace ( / \s + / g, ' ' ) ;
524+ if ( ! mediaQueryGroups . has ( mq ) ) mediaQueryGroups . set ( mq , [ ] ) ;
525+ const arr = mediaQueryGroups . get ( mq ) ;
526+ if ( arr ) arr . push ( innerContent . trim ( ) ) ;
527+ } else {
528+ nonMediaRules . push ( processedRule ) ;
529+ }
530+ } ) ;
531+ } ) ;
532+
533+ if ( useLayers ) {
534+ const allRules = [
535+ ...nonMediaRules ,
536+ ...Array . from ( mediaQueryGroups . entries ( ) )
537+ . filter ( ( [ , inner ] ) => inner . length > 0 )
538+ . map ( ( [ mq , inner ] ) => `${ mq } {\n${ inner . join ( '\n' ) } \n}` ) ,
539+ ] ;
540+ const collected = allRules . join ( '\n' ) ;
541+ return pri > 0
542+ ? `@layer priority${ index + 1 } {\n${ collected } \n}`
543+ : collected ;
544+ }
545+ return '' ;
522546 } )
523547 . join ( '\n' ) ;
524548
549+ const collectedCSS = useLayers
550+ ? perGroupOutput
551+ : [
552+ ...globalNonMediaRules ,
553+ ...Array . from ( globalMediaQueryGroups . entries ( ) )
554+ . filter ( ( [ , inner ] ) => inner . length > 0 )
555+ . map ( ( [ mq , inner ] ) => `${ mq } {\n${ inner . join ( '\n' ) } \n}` ) ,
556+ ] . join ( '\n' ) ;
557+
525558 return header + collectedCSS ;
526559}
527560
0 commit comments